pcntl多进程 mysql has gone away

szzfl 2012-03-01 08:51:56
如题,用pcntl产生多进程,数据库连接生成器是单例,父子进程间很容易出现mysql has gone away的现象,不知道有没有经验的人碰过这样的问题。
...全文
114 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
coder 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dream1206 的回复:]

http://blog.csdn.net/brightsnow/article/details/3997705
[/Quote]
主要是数据库的配置问题。
szzfl 2012-03-01
  • 打赏
  • 举报
回复
不管如何,谢谢你,我明天去公司也自己再研究一下。
改一下昵称 2012-03-01
  • 打赏
  • 举报
回复
抱歉其实我也没有实际应用过pcntl做项目。。只能建议你google一下各种可能,等待高手
szzfl 2012-03-01
  • 打赏
  • 举报
回复
不好意思,忘了在子进程后面加个exit,不然父子进程会以深度交叉的方式循环运行,结果肯定死机,都是我的示范代码没写好的错。当然我要问的不是这个问题,还是那个mysql has gone away的问题。

while(true){
$db = system::getdatabase(); //获取数据库连接 单例
$records = $db->find();
foreach($records as $record){
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
} else {
//这里子进程处理可能会用到数据库连接 比方
$db = system::getdatabase();
$db->delete();
exit(0);
}
}
sleep(1);
}
改一下昵称 2012-03-01
  • 打赏
  • 举报
回复
我是觉得是连接数过多的原因,因为子执行完
$db = system::getdatabase();
$db->delete(); // 这个差不多是断开连接的操作吧?
还会返回while循环再走父走过的路,因此程序陷入了死循环。
我修改了部分代码试着运行了一下,结果悲摧的直接死机了
szzfl 2012-03-01
  • 打赏
  • 举报
回复
大致如:
while(true){
$db = system::getdatabase(); //获取数据库连接 单例
$records = $db->find();
foreach($records as $record){
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
} else {
//这里子进程处理可能会用到数据库连接 比方
$db = system::getdatabase();
$db->delete();
}
}
sleep(1);
}

会造成父或者子进程出现:mysql has gone away,如此中断。子的还好,父的话就会循环程序中断,跳出,因为我的数据库错误是向外抛错误的。
改一下昵称 2012-03-01
  • 打赏
  • 举报
回复
pcntl_fork()后再分别连接数据库还是?

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧