关于php多进程编程(代码详解)-php教程

资源魔 32 0

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开发自学

抱歉,评论功能暂时关闭!