1.PHP popen如何实现多进程并发执行,循环里的pclose会等待进程完毕再进行下一次循环
2.假设有17个进程要开启,如何实现每次启动5个进程,并且每完成一个进程就关闭一个进程,同时开启下一个进程,也就是说最多只有5个进程同时执行
//启动2个进程
for($i = 0;$i < 2;$i++){
$command = "$phpPath $destPHPFile >> $logFile$i";
echo "进程开启时间".date('Y-m-d H:i:s')."\n";
$resource = popen($command,'r');
if(is_resource($resource)){
$success++;
pclose($resource);//下一次循环会等待上一个进程执行完毕,pclose才会释放资源
echo date('Y-m-d H:i:s')." 进程:".$i."启动完毕,执行完毕并关闭,开启下一个进程\n";
}else{
$failure++;
}
}
这样的做法相当于每次启动一个进程,循环执行,相当于单进程处理任务,如何做到多进程
谢邀.
如果你们有RabbitMQ的构架和经验, 实现这个很方便
rabbitmq 消息的消费端 channel 可以设置 prefetch=5, 即最多同时处理5条消息
rabbitmq 还有完善的ack机制, 即消息回执(该消息已正确处理完毕, 给我下条消息吧)
而且, 不会堵塞你当前PHP的进程, 后台(消费worker)会以5个并发的情形, 慢慢处理完这些任务
简单的可从Redis的List入手, 堵塞时判断队列的长度, 小于5时才开始popen并追加到队列
test.php
/diandao/script.php
/diandao/script.log 结果
数量判断那多写了个=号, 所以并发变成了6个
看到个帖子说到有个扩展可以实现子进程:Thread
大概描述了一下我的思路,这部分接触的不多,请多指教。
谢邀,这个感觉是进程池的概念吧。
谢邀。
popen是异步的,不会出现阻塞啊。理论上不会等一个线程结束才开始另一个线程的。