关于可控进程数的PHP多进程以及信号控制

注册博客园2年了,工作也2年了,还没有进来发过文章,先来试试。

 1 declare(ticks=1);
 2 $max = 5;
 3 $child = 1;
 4 function sig_handler($sig){
 5     global $child;
 6     switch ($sig){
 7         case SIGCHLD:
 8             echo 'sigchld received'."\n";
 9             $child --;
10             break;
11     }
12 }
13 pcntl_signal(SIGCHLD,'sig_handler'); //SIGCHLD 安装信号 子进程结束时候调用
14 //pcntl_signal(SIGCHLD,SIG_IGN);
15 while (true){
16     $child ++;
17     /**
18      * pcntl_fork 函数返回2个值 一个为0:表示为子进程,一个为正整数,表示为子进程ID 区别为:父进程在执行时候返回为正整数即子进程ID,子进程在执行时候返回为0
19      */
20     $pid = pcntl_fork();
21     if($pid){     //父进程
22         if($child > $max){
23             //如果子进程数超过了最大值,则挂起父进程
24             pcntl_wait($status);
25         }
26     }else{         //子进程 可以用pcntl_exec执行其他代码
27         echo "starting new child | now we have {$child} child process\n";
28         sleep(rand(3,5));
29         exit();
30     }
31 }

首先关于declare我看手册也是看的懵里懵懂的,手册上只是说【定义Tick 是一个在 declare 代码段中解释器每执行 N 条低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。】

这里是配合着pcntl_signal来进行使用,

pcntl_signal(SIGCHLD,'sig_handler'); //SIGCHLD 安装信号 子进程结束时候调用

SIGCHLD等信号就是linux里面的信号,可以去网站查一下,linux信号还有很多,比如说SIGTERM【程序结束(terminate)信号】

SIGHUP【终端的控制进程结束时信号】

pcntl_signal只是进行信号安装,然后在子进程结束的时候触发sig_handler方法,在此方法里面可以捕获导子进程结束信号

 

 

posted @ 2013-01-05 13:17  JohnnyWei  阅读(554)  评论(0编辑  收藏  举报