PHP: Что делает pcntl_fork()?
Функция PHP pcntl_fork должна разветвлять процесс так же, как стандартная функция fork в C.
Но мне было интересно, действительно ли эта функция вызывает процесс или если он эмулирует это поведение по-другому.
Если он действительно вызывает процесс, тогда он выясняет, какой процесс является одним из дочерних процессов Apache.
Это нормально, пока Apache использует MPM prefork (т.е. Один процесс за запрос).
Но что происходит, если Apache использует рабочий MPM?
Когда рабочий MPM используется, каждый дочерний процесс Apache содержит много потоков, каждый из которых обрабатывает другой HTTP-запрос. Поэтому, если вы откажетесь от процесса в этой ситуации, я даже не могу подумать, что произойдет со всеми этими потоками и запросами.
Поэтому, если pcntl_fork() действительно развивает процесс, я думаю, что не рекомендуется использовать эту функцию, если вы установите Apache для использования рабочего MPM.
Что говорят эксперты? Я рассуждаю хорошо, или я просто говорю глупости?
Ответы
Ответ 1
pcntl_fork
, вероятно, работает так, как вы думаете: он выдает текущий процесс так же, как это делает функция fork функции:
Функция pcntl_fork()
создает дочерний процесс, который отличается от родительский процесс только в PID и PPID.
Обратитесь к вашей системе fork(2)
справочная страница для конкретных подробно о том, как работает вилка на вашем система.
Но, цитируя раздел Введение процесса управления в руководстве:
Поддержка управления процессом в PHP реализует стиль Unix процесса создание, выполнение программы, сигнал обработки и завершения процесса.
Контроль процесса не должен быть включено в веб-сервере окружающей среды и неожиданных результатов произойти, если какой-либо контроль процесса функции используются в веб-сервере окружающая среда.
Итак, вы не должны использовать эту функцию из PHP script, выполняемой через Apache: ее следует использовать только тогда, когда ваш PHP скрипт выполняется из командной строки.
И, прежде чем приступать к использованию этой функции, не забывайте, что:
Примечание. Это расширение недоступно на платформах Windows.
Ответ 2
Не рекомендуется запускать 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 с помощью модуля prefork MPM по умолчанию.
Я также нашел эту страницу с некоторыми дополнительными инструкциями:
http://www.stevekallestad.com/blog/apache_worker_mpm_with_php.html
Ответ 3
Я постараюсь быть быстрым и лаконичным,
Использование "fork" через apache возможно, вам нужно "установить", а затем включить функции в php.ini, наконец вам нужно добавить расширение в Apache Directori (симлинк будет работать также )
Пример:
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
С другой стороны, я использую forking для большого количества проектов, и это действительно отлично подходит для оптимизации большинства из них, однако есть ошибка при злоупотреблении им с apache, im в основном для разветвления раздвоенного ребенка и делая anykind хардкорных вещей, и он работает... довольно хорошо, но под нагрузкой он работает некоторое время, прежде чем начать создавать зомби-процесс, я могу управлять процессом зомби, используя "pcntl_signal (SIGCHLD, SIG_IGN)"; который в основном будет удалять этот процесс, как только ребенок закончит свою задачу, это немного поможет, а затем, когда apache сойдет с ума, и начнет пронизывать себя и, наконец, сбой вашего сервера, я не могу объяснить это поведение (пока, но я буду) это дерево weir/evil, созданное apache, можно увидеть только из "ps", а также из состояния сервера или Apache, и я сказал дурное дерево, потому что он в основном создает сотни процессов с детьми детей...
в двух словах:
Вилка с apache будет работать? ДА... абсолютно
просто не злоупотребляйте им
надеюсь, что это поможет кому-то
Ответ 4
Я только что попытался использовать pcntl_fork через apache, странная ситуация заключается в том, что после того, как fork дочерний процесс, родительский дает стандартный вывод (браузер) его дочернему элементу. Таким образом, вы можете создать изображение, браузер не может получить результат от родительского процесса.