Завершение дочерних процессов зомби, разветвленных от сервера сокетов

отказ

Я хорошо знаю, что 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 не убивает зомби дочерние процессы?

Обновление 10 дней спустя

Я ответил на этот вопрос сам после некоторого дополнительного исследования, если ты все еще можешь выдержать мои разговорыдействовать по желанию.

Ответы на вопрос(4)

Ваш ответ на вопрос