Завершение дочерних процессов зомби, разветвленных от сервера сокетов
Я хорошо знаю, что PHP может быть не лучшим выбором в этом случае для сокет-сервера. Пожалуйста, воздержитесь от предложения разных языков / платформ - поверьте мне - я слышал это со всех сторон.
Работая вСреда Unix и используяPHP 5.2.17Моя ситуация выглядит следующим образом - я построил сервер сокетов в PHP, который взаимодействует с Flash-клиентами. Моим первым препятствием было то, что каждое входящее соединение блокировало последовательные соединения до тех пор, пока оно не завершило обработку. ярешена это с помощью PHPpcntl_fork()
, Я успешно смог породить множество дочерних процессов (сохранив их PID в родительском), которые позаботились о передаче сообщений другим клиентам и, следовательно, «освободили» родительский процесс и позволили ему продолжать обрабатывать следующее соединение [s].
Моя главная проблема прямо сейчас связана с обработкой / обработкой коллекции этих мертвых / зомби дочерних процессов и их завершением. Я прочитал (снова и снова) соответствующие страницы руководства по PHP дляpcntl_fork () и понять, чтородительский процесс отвечает за очистку своих детей, Родительский процесс получает SIGNAL от своего потомка, когда потомок выполняетexit(0)
, Я могу «поймать» этот сигнал, используяpcntl_signal()
функция для настройкиобработчик сигнала.
Мой обработчик сигнала выглядит так:
declare(ticks = 1);
function sig_handler($signo){
global $forks; // this is an array that holds all the child PID's
foreach($forks AS $key=>$childPid){
echo "has my child {$childPid} gone away?".PHP_EOL;
if (posix_kill($childPid, 9)){
echo "Child {$childPid} has tragically died!".PHP_EOL;
unset($forks[$key]);
}
}
}
Я действительно вижу оба эха включая соответствующий и правильный детский PID, который необходимо удалить, но кажется, что
posix_kill($childPid, 9)
Который я понимаю как синонимkill -9 $childPid
возвращает TRUE, хотя фактически НЕ удаляет процесс ...
Взято изсправочные страницыposix_kill
:
Возвращает TRUE в случае успеха или FALSE в случае неудачи.
Я наблюдаю за дочерними процессами с помощьюps
команда. Они появляются так в системе:
web5 5296 5234 0 14:51 ? 00:00:00 [php] <defunct>
web5 5321 5234 0 14:51 ? 00:00:00 [php] <defunct>
web5 5466 5234 0 14:52 ? 00:00:00 [php] <defunct>
Как видите, все эти процессы являются дочерними процессами родителя, который имеет PID5234
Я что-то упустил в моем понимании? Я, кажется, сумел заставить все работать (и это работает), но у меня остались бесчисленные процессы зомби в системе!
Мои планы на зомби-апокалипсис безупречны -
но что я могу сделать, когда дажеsudo kill -9
не убивает зомби дочерние процессы?
Я ответил на этот вопрос сам после некоторого дополнительного исследования, если ты все еще можешь выдержать мои разговорыдействовать по желанию.