php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo
//创建子进程 $pid=pcntl_fork(); //返回-1,创建失败,不会创建子进程,并引发PHP错误 if($pid==-1) { exit('创建子进程失败!'); } else if($pid) { //父进程得到子进程号,这里是父进程执行的逻辑 //为什么父进程得到?因为是父进程创建的子进程 } else { //子进程得到进程号为0,这里是子进程的逻辑 //为什么子进程得到0,因为是父进程创建的它 }
解析:
pcntl_fork会创建一个子进程,当创建了子进程后,后面的执行的代码是并行的.父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0。为什么?我在注释中已经注释了。
下面创建10个进程来执行网络请求任务
//创建10个进程去访问某个文章url for ($i=0; $i <10 ; $i++) { //创建子进程 $pid=pcntl_fork(); //返回-1,创建失败,不会创建子进程,并引发PHP错误 if($pid==-1) { echo ('创建子进程失败!'); } else if($pid) { //我是父亲进程逻辑模块 //pcntl_wait($status);//如果开启阻塞,那么父进程只能等子进程执行完成,再执行,可设置子进程的sleep进行测试 $id = getmypid(); echo '我是主进程id:'.$id.',我是子进程id:'.$pid."\r\n"; } else { //我是子进程逻辑模块 $url='https://blog.20230611.cn/?id=158'; sleep(1); file_get_contents($url); //我执行完成我就退出,如果不退出将会造成继续fork exit(); } }
解析:
以上代码创建10个进程对我的url分别请求一次,然后退出进程。其中父进程中pcntl_wait()是为了等待子进程中断,防止子进程成为僵尸进程,如果你开启了它,那么父进程将会等待并行的子进程完成并退出才执行。需要注意的是子进程使用完成及时exit,否则继续fork系统开销很大。为了保证系统稳定最好使用pcntl_signal()处理进程管理
前公司吃饭是需要在钉钉报餐的,对于不挑剔的我每天都在公司吃饭,有时忘记报餐导致吃不了饭还是很麻烦的。看了下报餐系统需要的是json数据包含我的工号即可。于是编写如下代码,放在360网址监控,1小时执行1次<?php /*自动报餐类*/ class AutoBaocan{...
如果想在windows中执行php,并且让php脚本在后台运行,可以用下面的cmd命令start /b php D:\wwwroot\default\demo1\run.php例如上面的命令意思后台运行run.php,如果想用php编写异步代码: ...
项目中使用服务来执行webservice,由于对方系统api不稳定,经常导致服务崩溃,只能重启,一个月差不多要重启一次。初期的解决办法是捕获异常,然后continue掉。<?php try { $url = 'http...
使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...
ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...