d-_*_*_-b 18 php mysql fork zend-framework
我有一个foreach循环,在其中分叉.在进程分叉之后,它访问数据库.我收到一个错误:
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
Run Code Online (Sandbox Code Playgroud)
问题是,我在分叉后连接到数据库.
我的问题:为什么会这样?
如果发生这种情况,我实际上是在分叉之前访问数据库吗?孩子会继承数据库连接吗?
(注意:我可以发布代码,但它相当大,因为它都在类中,这可能是导致我在访问数据库时的混乱.另一件事你应该知道我正在使用ZF.)
Fan*_*nis 14
(评论 - >按照海报的要求回答)
阅读更多内容我看到分叉的孩子继承他们父母的数据库连接,这是一个众所周知的问题:http://php.net/manual/en/function.pcntl-fork.php#70721
小智 7
这对我有帮助:http://www.electrictoolbox.com/mysql-connection-php-fork/
特别 mysql_connect($server, $username, $password, true);
小智 6
如果使用 SIGKILL 终止分叉进程,则可以避免在分叉进程退出时关闭连接。
<?php
$dbh = new PDO('pgsql:host=localhost', $username, $password);
$pid = pcntl_fork();
if($pid == 0){
register_shutdown_function(function(){
posix_kill(getmypid(), SIGKILL);
});
exit;
}
sleep(1);
$statement = $dbh->query('select 1');
var_dump($statement);
Run Code Online (Sandbox Code Playgroud)
出现此行为的原因是,当 PHP 进程退出时,PHP 会向数据库服务器发送“终止连接”命令。但是只有当套接字的所有链接都关闭时,系统才会关闭套接字。使用SIGKILL可以帮助我们避免向数据库服务器发送“终止连接”命令。