PHP: Что действительно делает pcntl_fork ()? - PullRequest
13 голосов
/ 10 января 2010

PHP-функция pcntl_fork должна обрабатывать процесс так же, как стандартная функция fork в C.
Но мне было интересно, действительно ли эта функция разветвляет процесс или эмулирует это поведение по-другому.
Если он действительно разветвляется, то ясно, какой это процесс: один из дочерних процессов Apache.
Это нормально, если Apache использует prefork MPM (т.е. один процесс на запрос).
Но что происходит, если Apache использует рабочий MPM ??
Когда рабочий MPM используется, каждый дочерний процесс Apache содержит много потоков, каждый из которых обрабатывает свой HTTP-запрос. Так что, если вы захотите разорвать процесс в этой ситуации, я даже не могу думать, что произойдет со всеми этими потоками и запросами.
Так что, если pcntl_fork () действительно разветвляет процесс, то я думаю, что не стоит использовать эту функцию, если вы настроили Apache на использование рабочего MPM.

Что говорят эксперты? Я хорошо рассуждаю или просто говорю глупости?

Ответы [ 4 ]

21 голосов
/ 11 января 2010

pcntl_fork, вероятно, работает так, как вы думаете: он разветвляет текущий процесс, так же, как вилка функции C:

Функция pcntl_fork() создает дочерний процесс, который отличается от родительский процесс только в своем PID и PPID.
Пожалуйста, смотрите ваши системы fork(2) справочная страница для конкретных подробности о том, как работает вилка на вашем система.


Но, цитируя раздел Введение в управление процессом руководства:

Поддержка управления процессом в PHP реализует стиль процесса Unix создание, выполнение программы, сигнал обработка и прекращение процесса.
Управление процессом не должно быть включен на веб-сервере окружение и неожиданные результаты могут произойдет, если какой-либо процесс управления функции используются в веб-сервере окружающая среда.

Таким образом, вам не следует использовать эту функцию из PHP-скрипта, выполняемого через Apache: ее следует использовать только тогда, когда ваш PHP-скрипт выполняется из командной строки.


И, прежде чем начать использовать эту функцию, не забудьте:

Примечание: это расширение недоступно на платформах Windows.

3 голосов
/ 11 января 2016

Я постараюсь быть быстрым и лаконичным,

Использование «fork» через apache возможно, вам нужно «установить», затем включить функции в php.ini, и, наконец, вам нужно добавить расширение в директории apache (символическая ссылка также должна выполнить работу. ) Пример:

echo "extension=pcntl.so" > /etc/php5/conf.d/pcntl.ini
ln -s /etc/php5/apache2/conf.d/pcntl.ini /etc/php5/mods-available/pcntl.ini 

С другой стороны, я использую разветвление для многих проектов, и действительно здорово оптимизировать большинство из них, однако есть ошибка при злоупотреблении им с помощью Apache, я в основном разветвляю разветвленного потомка и делать что-то вроде хардкорных вещей, и это работает ... довольно хорошо, но под нагрузкой это работает некоторое время, прежде чем приступить к созданию процесса зомби, я могу управлять процессом зомби, используя "pcntl_signal (SIGCHLD, SIG_IGN);" который в основном удалит процесс, как только ребенок закончит свою задачу, это немного поможет, тогда apache сходит с ума, начинает сам себе пускать потоки и, наконец, сбить ваш сервер, я не могу объяснить это поведение (пока, но я буду) это дерево вейра / зла, созданное apache, можно увидеть только из "ps", но не из журналов состояния сервера или apache, и я сказал злое дерево, потому что оно в основном создает сотни процессов с детьми потомков ...

в двух словах:

Вилка с apache будет работать? ДА ... абсолютно

просто не злоупотребляйте этим

надеюсь, это кому-нибудь поможет

3 голосов
/ 11 января 2010

Не очень хорошая идея запускать PHP как модуль на установке Apache, сконфигурированной в первую очередь для рабочего MPM, потому что PHP не является потокобезопасным (я думаю, это также указано в руководстве по PHP).

Это должно развить процесс, да. В руководстве по PHP даже говорится, что вы должны прочитать man fork(2) для получения дальнейших инструкций, так что, вероятно, это просто оболочка для функции C fork.

Обновление : Вот соответствующая страница в руководстве по PHP для рабочего MPM: http://php.net/install.unix.apache2.php

Примечание. Для создания многопоточной версии Apache целевая система должна поддерживать потоки. В этом случае PHP также должен быть построен с экспериментальной Zend Thread Safety (ZTS). При такой конфигурации не все расширения будут доступны. Рекомендуемая настройка - собрать Apache с MPM-модулем prefork по умолчанию.

Я также нашел эту страницу с некоторыми дальнейшими инструкциями: http://www.stevekallestad.com/blog/apache_worker_mpm_with_php.html

0 голосов
/ 06 июля 2012

Я только что попытался использовать pcntl_fork через apache, странная ситуация заключается в том, что после разветвления дочернего процесса родительский элемент передает стандартный вывод (браузер) своему потомку. Таким образом, вы можете создать изображение, браузер не может получить выходные данные от родительского процесса.

...