pcntl_fork和MySQL连接都没了

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可以帮助我们避免向数据库服务器发送“终止连接”命令。