監控的目的
pcntl_wait 等待或返回fork的子程式狀態(任意)
等同 pcntl_waitpid(-1, $status, 0) 都是等待任意子程式
pcntl_wtermsig 返回導致子程式中斷的訊號
<?php
echo "Master process id = " . posix_getpid() . PHP_EOL;
$childs = [];//定義一個全域性的子程式收集陣列
function fork() {//定義一個fork子程式函式
global $childs;
$pid = pcntl_fork();//fork 一個子程式
switch ($pid) {
case -1:
die('Create failed');
break;
case 0:
// Child
echo "Child process id = " . posix_getpid() . PHP_EOL;
while (true) {//死迴圈 執行任務
sleep(5);
}
break;
default:
// Parent
$childs[$pid] = $pid;//主程式 記錄子程式的程式id
break;
}
}
$count = 3;//fork 3個子程式
for ($i = 0; $i < $count; $i++) {
fork();
}
while ( count($childs) ) {//監控
if ( ($exit_id = pcntl_wait($status)) > 0 ) {//如果有子程式意外中斷了
echo "Child({$exit_id}) exited.\n";
echo "中斷子程式的訊號值是 " . pcntl_wtermsig($status) . PHP_EOL;//輸出中斷的訊號量
unset($childs[$exit_id]);//把中斷的子程式的程式id 剔除掉
}
if ( count($childs) < 3 ) {//如果子程式的程式數量小於規定的數量
fork();//重新開闢一個子程式
}
}
echo "Done\n";