您现在的位置是:首页 > 文章详情

php 利用pcntl扩展实现高并发

日期:2018-09-20点击:384

pcntl_fork官方描述:
pcntl_fork — 在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。

通过一段代码来理解pcntl_fork如何进行多进程并发执行的

$i = 2; while($i >= 0){ $pid = pcntl_fork(); if($pid > 0){ //当前处于父进程中 }elseif($pid == 0){ //这里是子进程逻辑 exit();//子进程跑完了必须退出。否则子进程会继续执行循环创建新的进程 }else{ //进程创建失败 }

当前进程通过pcntl_fork创建了一个子进程,创建完成后当前进程继续执行,此时$pid为创建子进程的进程id所以会进入pid > 0 的判断区块。同时,当父进程执行pcntl_fork时,php又会重新开启一个进程。该进程会拷贝父进程的变量,并且从pcntl_fork之后开始执行,因为进程为子进程,所以pid为0,会执行pid==0里面的逻辑。子进程逻辑跑完了建议退出,否则会继续执行while循环。

100个号码批量分成10个进程发送示例

//随机取100条数据 $mobileList = ['135***','139***',...,'152*****']; insert($data); function insert(array $phoneList){ $cnt = count($phoneList); //测试数组大小 $slice = 10; //需要调用的进程数量 $master = array_chunk($phoneList,floor($cnt/(10))); $childList = []; echo "进程开始\r\n"; while($slice > 0) { $pid = pcntl_fork(); if($pid > 0){ $childList[$pid] = 1; echo $pid."\r\n"; //$pid>0表示当前还在执行父进程的代码 //这里最好啥都不做,每次执行pcntl_fork都会执行这里的代码。 //这里的代码执行完之后 会将$pid设置为0,然后jump到pcntl_fork代码之后,重新做判断; }elseif($pid == 0){ //这里写我们的逻辑 foreach($master[$slice-1] as $val) { sendMessage();//发送短信 } //子进程执行完之后务必需要关闭; exit(); }else { //程序发生错误也需要关闭程序 exit(); } $slice--; } // 等待所有子进程结束后回收资源 while(!empty($childList)){ $childPid = pcntl_wait($status); if ($childPid > 0){ unset($childList[$childPid]); } } } 
原文链接:https://yq.aliyun.com/articles/643421
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章