2023年8月2日发(作者:)
ThinkPHP中使⽤PHPpcntl_fork实现多进程的坑最近要实现⼀个功能:根据卡号去第三⽅平台获取卡的详细信息,但是由于第三⽅相应速度⽐较慢(⼀张卡⼤概3S),在批量操作的时候,响应就会很慢,所以想到使⽤多进程去操作具体代码如下 set_time_limit(0); $forkNums = 20; //开启的进程数 if (!function_exists("pcntl_fork")) { die("pcntl extention is must !"); }
for($i=0;$i<$forkNums;$i++){ $pid = pcntl_fork(); //创建⼦进程 if ($pid == -1) { //错误处理:创建⼦进程失败时返回-1. die('could not fork'); } else if ($pid) { //⽗进程会得到⼦进程号,所以这⾥是⽗进程执⾏的逻辑 //如果不需要阻塞进程,⽽⼜想得到⼦进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成: pcntl_wait($status,WNOHANG); //等待⼦进程中断,防⽌⼦进程成为僵⼫进程。 } else { //这⾥写⼦进程执⾏的逻辑 $list = $this->mysql($v['start'],$v['rows']); foreach($list as $key=>$value){ $terminals = $this->getterminalinfo($value); //这⾥调⽤第三⽅接⼝,该过程⼤概需要3s // ... 这⾥再对获取到的卡号信息进⾏⾃⼰相关的业务处理 } unset($list); exit(0); }
}其中需要注意的⼏个坑:1、如果在ThinkPHP中使⽤多进程,切勿在⼦进程中连接数据库,会出现gateway timeout错误,导致⼦进程终⽌,执⾏失败。引起原因为ThinkPHP在操作数据库后,没有主动关闭连接,导致连接超时⽆法连接数据库,解决办法,⾃⼰写数据库连接代码,操作完之后,mysql_close($conn)关闭连接2、在⼦进程中的变量,使⽤完之后,务必记得unset()注销变量,否则造成内存溢出3、⼦进程执⾏完毕之后,需要exit(0)退出程序,否则⼦进程⽆法退出,造成僵⼫进程,占⽤系统资源。其他事项,具体开多少个⼦进程,视⾃⼰业务和服务器配置决定,不是越多越好,数量太多,会造成系统资源耗尽,造成web服务器⽆法访问
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690957018a472674.html
评论列表(0条)