注册博客园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方法,在此方法里面可以捕获导子进程结束信号