php 多进程下mysql连接 gone away

php 在命令行模式下启动多进程如果父进程有sql查询,可能会导致子进程里面的sql查询 报错  General error: 2006 MySQL server has gone away

当fork的子进程都共用相同的mysql连接的时候,会出现该错误,每个子进程单独一个mysql连接即可解决。

解决办法:在子进程执行之前,先把mysql的连接close即可。

$db = \Yii::$app->getDb();
$bizs = $db->createCommand("select xx from xxx where status = 0")->queryAll();

foreach ($bizs as $biz) {
    $biz = $biz['biz'];
    // 创建子进程
    $pid = pcntl_fork();
    if ($pid == -1) {
        // 返回值为-1,创建失败
        die('could not fork');
    } elseif ($pid) {
        // 返回值大于0,是父进程
        echo "parent \t", date("H:i:s", time()), "\n";
    } else {
        // 返回值等于0,是子进程
        echo "child \t", date("H:i:s", time()), "\n";
        try{
            \Yii::$app->db->close();// solve 子进程 MySQL server has gone
            $this->run($biz);
        }catch (Exception $e){
            var_dump($e);
        }

    }
}
\Yii::$app->db->close();// solve 主进程 MySQL server has gone



你可能感兴趣的:(php)