正在效劳器跑剧本时,防止没有了一些耗时义务,应用多过程是必不成少的。而正在 PHP5.5 之后,PHP 开端退出了多过程元素,以餍足开发需要。
保举课程:PHP教程。
php多过程普通使用正在php_cli饬令行中执行php剧本,完成多过程需求开启的扩大:pcntl、 posix(pcntl是process control过程治理的缩写)。Windows 环境下没有支持 PHP 的多过程编程,本文次要正在 Linux 环境下开发测试
pcntl_fork — 正在以后过程以后地位孕育发生分支(子过程)。
一个fork子过程的根底示例:
$pid = pcntl_fork(); //父过程以及子过程城市执行上面代码 if ($pid == -1) { //谬误解决:创立子过程失败时前往-1. die('could not fork'); } else if ($pid) { //父过程会失去子过程号,以是这里是父过程执行的逻辑 pcntl_wait($status); //期待子过程中缀,避免子过程成为僵尸过程。 } else { //子过程失去的$pid为0, 以是这里是子过程执行的逻辑。 }
假如一个义务被合成成多个过程执行,就会缩小全体的耗时。
比方有一个比拟年夜的数据文件要解决,这个文件由不少行组成。假如单过程执行要解决的义务,量很年夜时要耗时比拟久。这时候能够思考多过程。
来看一道面试题,有一个1000万个元素的int数组,需求乞降,均匀分到4个过程解决,每一个过程解决一局部,再将后果统计进去,代码以下
<?php $arrint = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];//假定不少 $arrint = array_chunk($arrint,4,TRUE); for ($i = 0; $i < 4; $i++){ $pid = pcntl_fork(); if ($pid == -1) { die("could not fork"); } elseif ($pid) { echo $pid; echo "I'm the Parent $i\n"; } else { // 子过程解决 // $content = file_get_contents("prefix_name0".$i); $psum = array_sum($arrint[$i]); echo $psum . "\n";辨别输入子过程的局部乞降数字,然而无奈进行想加,由于过程相互自力 exit;// 肯定要留意加入子过程,不然pcntl_fork() 会被子过程再fork,带来解决上的影响。 } } // 期待子过程执行结 while (pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); echo "Child $status completed\n"; }
上诉谜底中,是把数组分为4个子数组辨别用4个子过程行止理了,然而不方法把所较量争论的后果相加,由于过程都是自力实现义务的,不方法同享同一个(内存)变量,上面将引进音讯行列步队来处理过程通讯的成绩
<?php $arrint = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];//假定不少 $arrint = array_chunk($arrint,4,TRUE);//把数组分为4个 // 创立音讯行列步队,和界说音讯类型(相似于数据库中的库) $id = ftok(__FILE__,'m');//天生文件key,惟一 $msgQueue = msg_get_queue($id); const MSG_TYPE = 1; msg_send($msgQueue,MSG_TYPE,'0');//给音讯行列步队一个默许值0,必需是字符串类型 //fork出四个子过程 for ($i = 0; $i < 4; $i++){ $pid = pcntl_fork(); if ($pid == -1) { die("could not fork"); } elseif ($pid) { echo $pid; echo "I'm the Parent $i\n"; } else { // 子过程解决逻辑,互相自力,处理方法,放到内存音讯行列步队中 $part = array_sum($arrint[$i]); implode_sum($part);//分解较量争论出的sum exit;// 肯定要留意加入子过程,不然pcntl_fork() 会被子过程再fork,带来解决上的影响。 } } function implode_sum($part){ global $msgQueue; msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$sum);//猎取音讯行列步队中的值,最初一个参数为行列步队中的值 $sum = intval($sum) + $part; msg_send($msgQueue,MSG_TYPE,$sum);//发送每一次较量争论的后果给音讯行列步队 } // 期待子过程执行完结 while (pcntl_waitpid(0, $status) != -1) { $status = pcntl_wexitstatus($status); $pid = posix_getpid(); echo "Child $status completed\n"; } //一切子过程完结后,再掏出最初正在行列步队中的值,就是int数组的以及 msg_receive($msgQueue,MSG_TYPE,$msgType,1024,$sum); echo $sum;//输入120
以上就是php多过程函数的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
抱歉,评论功能暂时关闭!