Timer::add(1, "\\Workerman\\Worker::checkIfChildRunning");
/**
* check if child processes is really running
*/
public static function checkIfChildRunning()
{
foreach (static::$_pidMap as $worker_id => $worker_pid_array) {
foreach ($worker_pid_array as $pid => $worker_pid) {
if (!\posix_kill($pid, 0)) {
unset(static::$_pidMap[$worker_id][$pid]);
}
}
}
}
$pid = \pcntl_wait($status, \WUNTRACED);
// Calls x handlers for pending signals again.
\pcntl_signal_dispatch();
if($pid > 0)
{
// ....
// Clear process data.
unset(static::$_pidMap[$worker_id][$pid]);
// ....
}
主進程,檢查子進程是否全部退出,然后清理子進程殘留數(shù)據(jù)。這里通過添加定時器去檢測是否運行,子進程退出后,主進程的pcntl_wait 不是會收到退出pid 然后進行清理。
那么為什么還要額外添加定時器去清理呢?這個定時器在主進程退出的時候也沒有進行Timer::del($timer_id) 呢???