我试着延长 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
. 我唯一能看到连接创建的地方就是这里
我非常感谢你在这个问题上的帮助。
4条答案
按热度按时间vjrehmav1#
问题解决了,尽管我还是不明白为什么会发生。
记录器记录到数据库中,但由于它是从di获取的,所以我假设它重用现有的连接。从构造函数中删除该行,并将其放在调用记录器之后,解决了问题。
kqlmhetl2#
看起来模块多次尝试连接到数据库。也许你要确保你的数据库服务只初始化一次
Module.php
yduiuuwa3#
当您在$di中声明db时,也许可以将db服务作为共享的
brccelvz4#
在phalcon中扩展类是不对的,这些类实际上是与其他php扩展交互的。这是很难学会的。
我推荐的简单方法是将mvc/model类重写为modelcommon或basemodel,并在那里实现
Model::initialize
以及Model::afterFetch
.但一个合适的方法是使用phalcon开发的事件机制。诀窍是依附于
beforeQuery
和/或afterQuery
事件。在di中完成的快捷方式: