PHP: что на самом деле делает pcntl fork ()?

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

Что говорят эксперты? Хорошо ли я рассуждаю, или Я просто несу чушь?

4 ответов


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

на инструкции :

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

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


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

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


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

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

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

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

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


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

использование "fork" через apache возможно, вам нужно "установить", затем включить функции в php.ini, наконец, вам нужно добавить расширение в Apache directori (символическая ссылка также выполнит эту работу) Ex:

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

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

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

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

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


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