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