<?php $pid = pcntl_fork(); //父進程和子進程都會執行下面代碼 if ($pid == -1) { //錯誤處理:建立子進程失敗時返回-1. die('could not fork'); } else if ($pid) { //父進程會獲得子進程號,因此這裏是父進程執行的邏輯 pcntl_wait($status); //等待子進程中斷,防止子進程成爲殭屍進程。 } else { //子進程獲得的$pid爲0, 因此這裏是子進程執行的邏輯。 exit();//子進程執行完後應該退出,否則會繼續執行後面的邏輯 }
<?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) }
<?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(); };
<?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(); } }