Запуск разветвленных php-приложений - PullRequest
1 голос
/ 01 ноября 2009

Каковы недостатки использования разветвленного PHP-приложения в Интернете?

Я читал, что он не должен запускаться под Apache по какой-либо причине, но никогда не объяснял почему.
Единственная причина, по которой я могу думать, заключается в том, что если сценарий завершается в середине выполнения, любой разветвленный процесс никогда не будет завершен и может вызвать утечки памяти.

Вопрос касается расширений pcntl

<?php
$pid = pcntl_fork();
if ($pid)
{
  //parent, execute parent code
}
else
{
  //child code
}
?>

Я прав в этом предположении?

1 Ответ

3 голосов
/ 01 ноября 2009

Вызов fork () из процесса сервера Apache (а затем НЕ выполнение) - очень плохая идея.

Основная проблема заключается в том, что файловые дескрипторы по-прежнему будут передаваться родителю, а это означает, что такие вещи, как соединения с базой данных и сокеты, будут использоваться бесполезным образом.

Вместо использования fork (), просто создайте отдельный процесс - если вы хотите запустить PHP, запустите исполняемый файл командной строки PHP, чтобы скрипт выполнял все, что вы хотите.

В противном случае вы заставите Apache делать плохие вещи - например, если родительский процесс затем обслуживает больше запросов по тому же соединению, а ваш разветвленный процесс отправляет какой-то вывод, он будет чередоваться в произвольных точках в ответ - который будет генерировать, казалось бы, случайные, трудно диагностируемые ошибки. Ситуация работает еще хуже, если соединение SSL (сеанс SSL будет содержать ошибки и неожиданно прекратиться, что приведет к некоторым странным ошибкам браузера в моем опыте).

Хотя fork () кажется удобным, риск просто не стоит. Это не работает в общем случае.

...