PHP连接mysql后pcntl_fork产生的错误

最近使用PHP做多进程上传碰到了一个问题,上传完成以后写入数据库时报错:Packets out of order. Expected 1 received 0. Packet size=4131940

也有可能是:MySQL server has gone away

总之可能是这种各样奇怪的错误


思考了一下,考虑到PDO是在主进程中创建的,因此fork后多个子进程使用的是同一个PDO连接,如果有两个子进程同时使用该连接与数据库通信,那么就可能因为通信协议时序的不正确导致mysql出现异常


为了验证该想法,写了一个测试程序抓包看了一下

$dsn = "mysql:host={$host};dbname={$dbName};port={$port};charset=utf8";
$dbh = new PDO($dsn, $user, $pswd);

for ($i=0; $i < 2; $i++) { 
	$pid = pcntl_fork();
    if ($pid == -1) {
        throw new \Exception("Fork process error!", 1);
    }
    if ($pid == 0) {    // child
        $sth = $dbh->query("select * from test_table");
        exit(0);
    }
}



从抓包结果可以看到两个子进程确实是使用的同一个tcp链接,其中61是客户机,178是服务机


知道了原因,解决起来就好办了,不要使用主进程中创建的mysql连接,进入子进程了以后再重新建立新的mysql连接就不会出现这种问题了


参考链接:https://bugs.php.net/bug.php?id=67061

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值