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