Code前端首页关于Code前端联系我们

ThinkPHP利用PHP pcntl_fork工具了解多进程编程的陷阱

terry 2年前 (2023-09-25) 阅读数 51 #后端开发

功能实现:根据卡号去第三方平台获取卡信息。但是由于第三方响应速度比较慢(一张卡大概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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门