Pale Purple https://www.palepurple.co.uk Office Address Registered Office Blount House, Hall Court, Hall Park Way,,
Telford, Shropshire, TF3 4NQ GB
sales@palepurple.co.uk GB 884 6231 01
We have a set of PHPUnit tests running against a Propel/PDO application.
Recently, with a recent increase in the number of tests, we’ve found that we’ve been hitting MySQL’s max_connections
or max_user_connections
limit (see /etc/mysql/my.cnf
on the MySQL server).
Exception messages like the following would be seen :
PropelException: Unable to open PDO connection [wrapped: SQLSTATE[42000] [1203] User xxx already has more than 'max_user_connections' active connections]
One approach around this is to just increase the max_connections
/max_user_connections
setting/variables – but this didn’t feel right.
We investigated various approaches to trying to close the database connections – using unset($conn)
or $conn = null
had no effect, and nor did changing the PDO connection timeout attribute ($conn->setAttribute(PDO::ATTR_TIMEOUT, $newValue)
).
Eventually we found a rather nasty solution, which is to add to the unit test’s tearDown method a call which tells the MySQL server to close the connection. A side effect of this is that PHP/PDO then raises an exception, so it doesn’t feel quite right… but nonetheless …. it does solve the connection count issue.
class MyTest extends PHPUnit_Framework_TestCase { ..... public function tearDown() { /* @var $conn PDOConnection */ .... try { $conn->exec('KILL MY_CONNECTION();'); } catch(Exception $e) { /* ignore */ } } .... }
‹ require.js – an introduction Saving memory under Linux when using virtualisastion ›