ThinkPHP 中使用 PHP pcntl_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服务器无法访问

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值