edd*_*147 2 mysql phpunit dbunit pdo
在运行PHPUnit测试时,会创建许多连接但不会关闭.我可以看到这个
mysql> show processlist;
Run Code Online (Sandbox Code Playgroud)
在我的数据库类中,我通过实现PHPUnit_Extensions_Database_TestCase#getConnection()来创建数据库连接.
我确保在拆解时连接关闭.请参阅代码段:
<?php
abstract class My_Tests_DatabaseTestCase extends \PHPUnit_Extensions_Database_TestCase
{
static private $pdo = null;
private $conn = null;
/**
* @throws RuntimeException
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
final public function getConnection()
{
$iniFilePath = __DIR__ . '/../../../db-config.ini';
$iniFile = parse_ini_file($iniFilePath, true);
$dsn = "mysql:dbname=".$iniFile['phpunit']['dbname'].";host=".$iniFile['phpunit']['host'];
if ( $this->conn === null ) {
if ( self::$pdo == null ) {
self::$pdo = new \PDO($dsn, $iniFile['phpunit']['user'], $iniFile['phpunit']['password']);
}
$this->conn = $this->createDefaultDBConnection(self::$pdo, $iniFile['phpunit']['dbname']);
}
return $this->conn;
}
protected function getSetUpOperation()
{
return new \PHPUnit_Extensions_Database_Operation_Composite(array(
new \TestsExtensions\TruncateDatabaseOperation(),
\PHPUnit_Extensions_Database_Operation_Factory::INSERT()
));
}
protected function getTearDownOperation() {
return \PHPUnit_Extensions_Database_Operation_Factory::TRUNCATE();
}
protected function setUp()
{
parent::setUp();
$em = \ORM\Provider::getInstance()->getEntityManager(\ORM\Provider::DEFAULT_ID);
$em->clear();
}
protected function tearDown()
{
parent::tearDown();
$em = \ORM\Provider::getInstance()->getEntityManager(\ORM\Provider::DEFAULT_ID);
$em->getConnection()->close();
if ($this->conn) {
$this->conn->close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
调试显示连接已关闭,但进程列表显示状态为"sleep".连接量上升,直到我收到"太多连接"错误.
我不想增加连接数.我想关闭连接.
我可以修改什么来实现这一目标?
PDO连接管理的片段:
成功连接到数据库后,将向您的脚本返回PDO类的实例.该连接在该PDO对象的生命周期内保持活动状态.要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁对象 - 您可以通过为保存对象的变量赋值来执行此操作.如果您没有明确地执行此操作,PHP将在脚本结束时自动关闭连接.
在拆解时不要存储PDO或将其设置为null:
去掉 static private $pdo = null;
要么
protected function tearDown()
{
parent::tearDown();
$em = \ORM\Provider::getInstance()->getEntityManager(\ORM\Provider::DEFAULT_ID);
$em->getConnection()->close();
if ($this->conn) {
$this->conn->close();
}
self::$pdo = null;
}
Run Code Online (Sandbox Code Playgroud)
如果您要将它传递到PHPUnit数据库连接,我认为您不需要存储PDO
归档时间: |
|
查看次数: |
2180 次 |
最近记录: |