php多过程编程
PHP的过程管制支持完成了Unix形式的过程创立, 顺序执行, 旌旗灯号解决和过程的中缀。 过程管制不克不及被使用正在Web效劳器环境,当其被用于Web效劳环境时可能会带来不测的后果。
pcntl函数
pcntl_fork():正在以后过程以后地位孕育发生分支(子过程)。
译注:fork是创立了一个子过程,父过程以及子过程 都从fork的地位开端向下持续执行,没有同的是父过程执行进程中,失去的fork前往值为子过程 号,而子过程失去的是0
<?php $pid = pcntl_fork(); //父过程以及子过程城市执行上面代码 if ($pid == -1) { //谬误解决:创立子过程失败时前往-1. die('could not fork'); } else if ($pid) { //父过程会失去子过程号,以是这里是父过程执行的逻辑 pcntl_wait($status); //期待子过程中缀,避免子过程成为僵尸过程。 } else { //子过程失去的$pid为0, 以是这里是子过程执行的逻辑。 exit();//子过程执行完后应该加入,否则会持续执行前面的逻辑 }
● pcntl_wait(int &$status[, int $options = 0]):期待或前往fork的子过程状态,相称于pcntl_waitpid(-1,int &$status[,int $options = 0])
● pcntl_waitpid(int $pid , int &$status[,int $options = 0]) $status是作为一下函数的参数
● pcntl_wifexited(int $status) 反省子过程状态代码能否代表失常加入,
● pcntl_wexistatus(int $status) 前往一个中缀的子过程前往代码,仅正在失常中缀才无效
● pcntl_wifsignaled(int $status) 反省子过程能否由某个未捕捉的旌旗灯号加入的。是前往true,否前往false
● pcntl_wtermsig(int $status)前往招致子过程中缀的旌旗灯号,当pcntl_wifsignaled前往true时无效
<?php echo "主过程\n"; $pid = pcntl_fork(); //父过程以及子过程城市执行这些代码 if($pid == -1 ){ //创立子过程失败会前往-1 throw new Exception ('fork error on Task object'); }else if($pid){ //创立胜利会父过程会失去子过程的pid echo "期待子过程执行"; pcntl_wait($status);//期待子过程中缀 echo "子过程执行状态:"; echo "能否失常加入:",pcntl_wifexited($status),"\n"; echo "子过程前往的代码:",pcntl_wexitstatus($status),"\n";//仅正在pcntl_wifexited前往true时失效,只能是int,输入123 echo "子过程能否是因为某个未捕捉的旌旗灯号加入的:",pcntl_wifsignaled($status),"\n";//假如是kill -9|-15 杀死的过程前往true echo "招致子过程中缀的旌旗灯号:",pcntl_wtermsig($status),"\n"; 输入 9 | 15 var_dump($status); }else{ //创立胜利子过程会失去pid=0 sleep(2); echo "子过程执行终了\n"; exit(123) }
● pcntl_alarm(int $seconds):为过程设置一个alarn闹钟旌旗灯号
● pcntl_signal(int $signo, callback $handler [, bool $restart_syscalls = true ] )为指定的旌旗灯号装置一个新的旌旗灯号解决器
● pcntl_signal_get_handler(int $signo) 猎取指定旌旗灯号的解决函数
<?php echo "设置3秒之后发送闹钟旌旗灯号\n"; pcntl_alarm(3); function dealSigalarm(){ echo "收到旌旗灯号 SIGALRM \n加入顺序。。。\n"; exit(); } echo "装置旌旗灯号解决器\n"; pcntl_signal(SIGALRM,"dealSigalarm");//关于不克不及被梗阻、解决以及疏忽的旌旗灯号,php为这些工夫注册旌旗灯号解决函数会孕育发生一个致命谬误SIGSTOP,SIGKILL var_dump(pcntl_signal_get_handler(SIGUSR1));//输入dealSigalarm pcntl_signal(SIGUSR1,function(){ echo "收到用户自界说旌旗灯号\n"; }); $i = 1; while(1){ sleep(1); echo $i++,"\n"; echo "散发... \n"; pcntl_signal_dispatch(); };
● pcntl_getpriority( int $pid = getmypid() [, int $process_identifier = PRIO_PROCESS ])猎取过程的优先级
● pcntl_setpriority( int $priority [ , int $pid = getmypid() [, int $process_identifier = PRIO_PROCESS]])设置过程的优先级
● getmypid() 猎取以后php过程的pid
● posix_getpid() 猎取以后过程的pid
<?php /** * php过程的优先级 */ for($i = 1;$i<=5;$i++){ $pid = pcntl_fork(); if($pid == -1){ throw new Exception("fork error on task object"); }else if ($pid){ pcntl_wait($status); }else{ $end_time = time()+3; $k = 0; while(time()<=$end_time){ $k++; } $pid = getmypid(); echo "以后过程id:".$pid,"优先级:",pcntl_getpriority($pid); pcntl_setpriority($i); echo "修正之后的优先级为:",pcntl_getpriority(),"\n"; echo "执行了过程{$i} {$k}次\r\n"; exit(); } }
更多php相干常识,请拜访php教程!
以上就是对于php多过程编程(代码详解)的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!