Назад | Перейти на главную страницу

Когда и как Apache убивает дочерний процесс, созданный вами в PHP?

Не уверен, что это больше подходит для сбоя сервера или переполнения стека, но начнем.

Я использую mod_php в предварительном форке Apache MPM и создаю новый процесс, например:

<?php
exec("/usr/bin/php -f backgroundScript.php &");
?>

Предполагая, что новый дочерний процесс backgroundScript.php выполняется в течение длительного времени ...

1) Считается ли родительский процесс PHP простаивающим? Он возвращается в пул серверов?

2) Если Apache убивает родительский процесс PHP, чтобы вернуться к MinSpareServers, будет ли backgroundScript.php также очищен или будет продолжать работать бесконечно?

3) Есть ли другие способы, которыми Apache может непреднамеренно убить дочерний процесс backgroundScript.php? service httpd stop возможно?

Вы хотите запустить приложение в фоновом режиме и забыть?

на php.net есть много сообщений об этом

Также, заметка от руководителя:

Примечание:

Если программа запускается с этой функцией, для продолжения работы в фоновом режиме вывод программы должен быть перенаправлен в файл или другой поток вывода. В противном случае PHP зависнет до завершения выполнения программы.

тем же Вот и Вот и Вот и т.д

У меня ужасный код, нарушающий эти правила:

<?php
echo "pre";
exec("someuglylongandworkingthingwithoutput &");
echo "post";
?>

Только что протестировал на моей коробке Fedora со стандартным apache + php (prefork + module), я убил процессы с помощью killall -9 / usr / sbin / httpd

  1. несмотря & - нет, все еще считается запущенным. мое фоновое приложение все еще работает
  2. согласно моему тесту выше - он будет продолжаться
  3. зависит от того, как сценарий инициализации завершает работу apache, то же самое в соответствии с п.1.

После добавления /dev/null - все нормально, id родительского процесса "1".