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