这篇文章主要介绍了关于php多进程执行任务的说明,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
需求
对指定数量的多个任务并发执行,并控制进程数
进程&线程:
进程间相互独立,不影响。
代码示例:
<?php $task = 0; //任务id $taskNum = 10; //任务总数 $processNumLimit = 2; //子进程总量限制 while(true){ //产生分支 $processid = pcntl_fork(); //创建子进程失败 if( $processid == -1 ){ echo "create process error!\n"; exit(1); } //主进程,获得子进程pid elseif($processid){ $task++; //下一个任务 $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\n"; //控制进程数 if($task >= $processNumLimit) { echo "wait chl start!\n"; $exitid = pcntl_wait($status); //等待退出 echo "wait chl end!extid:",$exitid,"\tstatus:",$status,"\n"; } //任务总量控制 if($task >= $taskNum) { echo "taskNum enough!\n"; break; } } //processid=0为新创建的进程 else{ //模拟不同任务的不同执行时长 $sleep = rand(1, 5); $currentProcessid = posix_getpid(); //当前进程的Id $parentProcessid = posix_getppid(); // 父级进程的ID $phpProcessid = getmypid(); //当前php进程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!\n"; sleep($sleep); echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!\n"; exit(0); //子进程执行完后退出,防止进入循环创建子进程 } }
执行的结果:
task:1 processid:32225 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 begin! task:2 processid:32226 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 begin! task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 end! wait chl end!extid:32226 status:0 task:3 processid:32228 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 begin! task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 end! wait chl end!extid:32228 status:0 task:4 processid:32229 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 begin! task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 end! wait chl end!extid:32225 status:0 task:5 processid:32270 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 begin! task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 end! wait chl end!extid:32229 status:0 task:6 processid:32271 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 begin! task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 end! wait chl end!extid:32270 status:0 task:7 processid:32273 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 begin! task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 end! wait chl end!extid:32273 status:0 task:8 processid:32274 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 begin! task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 end! task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 end! wait chl end!extid:32274 status:0 task:9 processid:32277 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! wait chl end!extid:32271 status:0 task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 begin! task:10 processid:32278 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224 wait chl start! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 begin! task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 end! task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 end! wait chl end!extid:32277 status:0 taskNum enough
执行分析:
在pcntl_fork出创建子进程后,子进程执行功能代码,父进程继续递增任务id,创建下一个任务进程;
通过pcntl_wait等待有子进程执行完毕退出后,再新创建进程,实现进程总数的控制;
在主进程完成创建后,通过break退出循环。此时可能有子进程继续执行。
相关函数:
pcntl_fork
在当前进程当前位置产生分支(子进程)。成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。
pcntl_wait
等待或返回fork的子进程状态。wait函数刮起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。 如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将 被释放。
其他:
1.僵尸进程及孤儿进程的问题
部分僵尸进程被pcntl_wait获取状态并释放资源,未接管的进程在主进程退出后成为孤儿进程。孤儿进程被init进程收养,完成wait的状态获取和资源释放。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上是php多进程执行任务的说明的详细内容。更多信息请关注PHP中文网其他相关文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

Golang作为一门高并发编程语言,其内置的协程机制和多线程操作实现了轻量级的多任务处理。然而,在多进程处理的场景下,不同进程之间的通信和共享内存成为了程序开发的关键问题。本文将介绍在Golang中实现多进程之间共享内存的应用方法。一、Golang中多进程的实现方式在Golang中,可以通过多种方式实现多进程并发处理,其中包括fork、os.Process、

大家都知道 Node.js 是单线程的,却不知它也提供了多进(线)程模块来加速处理一些特殊任务,本文便带领大家了解下 Node.js 的多进(线)程,希望对大家有所帮助!

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

golang是多进程,其线程模型是MPG模型,整体上Go程与内核线程是多对多对应的,因此首先来讲就一定是多线程的。Golang有些所谓的M比N模型,M个线程下可以创建N个go routine,一般而言N远大于M,本质上属于多线程模型,但是协程的调度由Go的runtime决定,强调开发者应该使用channel进行协程之间的同步。

转化方法:1、使用“mb_substr($url,stripos($url,"?")+1)”获取url的参数部分;2、使用“parse_str("参数部分",$arr)”将参数解析到变量中,并传入指定数组中,变量名转为键名,变量值转为键值。

去除方法:1、使用substr_replace()函数将首位数字替换为空字符串即可,语法“substr_replace($num,"",0,1)”;2、用substr截取从第二位数字开始的全部字符即可,语法“substr($num,1)”。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),