2010-01-10 2 views
13

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

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

+0

Связанные материалы можно найти в главе о контроле процесса в http://www.tuxradar.com/practicalphp/16/1/0 – Gordon

+0

взгляните на http: // stackoverflow.com/вопросы/12214785/how-to-use-pcntl-fork-with-apache – yegor256

ответ

21

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

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


Но, цитируя Introduction of the Process Control раздел руководства: поддержка управления

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

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


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

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

+3

«Контроль процесса не должен включаться в среде веб-сервера» => Обязательно помните, чтобы всегда читать интродукции! – GetFree

+5

Жизненный цикл будет недостаточным для чтения всего руководства ;-( –

+0

@PascalMARTIN,? Что означает этот комментарий? – Pacerier

3

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

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

Update: Вот соответствующая страница в 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

+0

Это. Только fork cli PHP. – Evert

0

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

+1

Прочтите принятый ответ и, в частности, мой комментарий к этому ответу. – GetFree

+0

Спасибо за сообщение :) – bourneli

3

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

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

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

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

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

надеюсь, что это поможет некоторым один

 Смежные вопросы

  • Нет связанных вопросов^_^