ThinkPHP利用PHP pcntl_fork工具了解多进程编程的陷阱
功能实现:根据卡号去第三方平台获取卡信息。但是由于第三方响应速度比较慢(一张卡大概3S左右),批量操作时,响应很慢,所以就想到了使用多进程来工作
详细代码如下
set_time_limit(0);
$ forkNums = 20; //打开进程数
if ( !function_exists("pcntl_fork")) {
die("需要pcntl扩展!");
}
for($i=0;$i mysql($v['start'],$v['rows']);
foreach ( $list as $key=>$value){
$terminals = $this->getterminalinfo($value); //这里调用第三方接口。该过程大约需要3秒
// ... 这里我们对获取到的卡号数据进行我们自己的相关业务处理
}
unset($list);
exit(0);
}
}
需要注意的几个陷阱:
1。如果在 ThinkPHP 中运行多个进程,请勿在子进程中连接数据库。网关超时错误,导致子进程终止,执行失败。原因是ThinkPHP使用数据库后没有主动关闭连接,导致连接超时,无法建立与数据库的连接。解决办法就是自己写数据库连接代码。操作完成后,mysql_close($conn)关闭连接
2。在子进程中使用变量后,记得用unset()取消注册该变量,否则会导致内存溢出
3。当子进程结束后,必须用exit(0)退出程序,否则子进程无法退出,造成僵尸进程,占用系统资源。
其他:可以打开的子进程数量取决于你公司和服务器的配置。更多并不总是更好。太多会导致系统资源耗尽,导致 Web 服务器无法访问。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。