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]);
// ....
}
主進(jìn)程,檢查子進(jìn)程是否全部退出,然后清理子進(jìn)程殘留數(shù)據(jù)。這里通過(guò)添加定時(shí)器去檢測(cè)是否運(yùn)行,子進(jìn)程退出后,主進(jìn)程的pcntl_wait 不是會(huì)收到退出pid 然后進(jìn)行清理。
那么為什么還要額外添加定時(shí)器去清理呢?這個(gè)定時(shí)器在主進(jìn)程退出的時(shí)候也沒(méi)有進(jìn)行Timer::del($timer_id) 呢???