gpt4 book ai didi

php - 扩展 Phalcon\Db\Adapter\Pdo\Mysql 时连接过多

转载 作者:行者123 更新时间:2023-11-29 10:25:53 28 4
gpt4 key购买 nike

我尝试扩展 Phalcon\Db\Adapter\Pdo\Mysql 以在每次查询函数返回 false 时创建日志。

尽管除了 parent::__construct 中的连接之外我没有创建任何新连接,但我收到以下异常:

Fatal error: Uncaught PDOException: SQLSTATE[08004] [1040] Too many connections in ...Internal/Database/Mysql.php:14 Stack trace: #0 [internal function]: PDO->__construct('mysql:adapter=M...', '...', '...', Array) #1 [internal function]: Phalcon\Db\Adapter\Pdo->connect(Array) #2  .../Internal/Database/Mysql.php(14): Phalcon\Db\Adapter\Pdo->__construct(Array) #3 .../apps/bootstrap/app.php(378): Internal\Database\Mysql->__construct(Array) #4 [internal function]: Closure->{closure}() #5 [internal function]: Phalcon\Di\Service->resolve(NULL, Object(Phalcon\Di\FactoryDefault)) #6 .../apps/bootstrap/core_services.php(7): Phalcon\Di->get('logs') #7 [internal function]: Closure->{closure}() #8 [internal function]: Phalcon\Di\Service->resolve(NULL, Object(Phalcon\Di\FactoryDefault)) #9 .../apps/libs/Internal/Database/Mysql.php(15): Phalcon\Di->get('logger') #10 .../apps/bootstrap/app.php(37 in .../apps/libs/Internal/Database/Mysql.php on line 14

代码:

namespace Internal\Database;

use Phalcon\Db\Adapter\Pdo\Mysql as PhalconMysql;
use Phalcon\Di;

class Mysql extends PhalconMysql
{
public $isLogger = false;

public function __construct(array $descriptor)
{
parent::__construct($descriptor);
$this->oLogger = Di::getDefault()->get('logger');
}

public function query($sqlStatement, $bindParams = null, $bindTypes = null)
{
$oResult = parent::query($sqlStatement, $bindParams, $bindTypes);
if ($oResult === false && $this->isLogger === false) {
$trace = debug_backtrace();
$aCaller = array_shift($trace);
$sFile = $aCaller['file'];
$sLine = $aCaller['line'];
$this->oLogger->error('MySQL query failed. File: ' . $sFile . ', Line: ' . $sLine, ['error' => $this->getErrorInfo()]);
}
return $oResult;
}
}

触发错误的行是parent::__construct($descriptor);

我所做的唯一其他更改是将 Phalcon\Db\Adapter\Pdo\Mysql 的使用替换为 Internal\Database\Mysql。所有连接的创建方式与我使用 Phalcon\Db\Adapter\Pdo\Mysql 时的方式相同。

我查看了 Phalcon\Db\Adapter\Pdo\Mysql 的父类。我看到创建的连接的唯一地方是 here

非常感谢您对这个问题的帮助。

最佳答案

在 phalcon 中扩展类并不是正确的事情,因为它们实际上与其他 php 扩展交互。经历了一番艰难才学会的。

我推荐的简单方法是重写 Mvc/Model 类,例如。 ModelCommon 或 BaseModel,并在那里实现 Model::initializeModel::afterFetch

但正确的方法是使用 Phalcon 开发的事件机制。诀窍是附加到 beforeQuery 和/或 afterQuery 事件。

快捷方式,在 DI 中完成:

$di->set('db', function() use ($di) {
$config = $di->getConfig();
$connection = new \Phalcon\Db\Adapter\Pdo\Mysql([
// ...
]);

$eventsManager->attach('db', function($event, $connection, $params) use ($config) {

if ($event->getType() == 'beforeQuery') {
// ...
}

if ($event->getType() == 'afterQuery') {
// ...
}
});

$connection->setEventsManager($eventsManager);
return $connection;
});

关于php - 扩展 Phalcon\Db\Adapter\Pdo\Mysql 时连接过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48320106/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com