Intereting Posts
Symfony2.4 form 'Эта форма не должна содержать лишних полей Создание дерева из плоского массива в PHP google-api-php-client – Диск – Вставка файла – Создание текстового файла – Содержимое не добавляется Неустранимая ошибка: уровень вложенности слишком глубокий – рекурсивная зависимость? Laravel Mail отправляет электронную почту, но возвращает false Переименовать URL-адреса Openencart проверять текстовое поле при вводе php Не удается добавить новые строки в поле оповещения JavaScript? Обновление нескольких записей MySQL с использованием одного вызова mysqli_query в PHP Определение кросс-платформенной функции money_format (Linux и Windows) Запустить php-код в командной строке Кодировать массив в строку JSON без индексов массива Как создать сообщение в WordPress Programmatically как запустить php-код на кнопку отправки без обновления / перезагрузки страницы Поместить текущую дату в скрытом поле

PHP: Что делает pcntl_fork ()?

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

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

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

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

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

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

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

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

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

Не рекомендуется запускать 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

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

Используя «fork» через apache, возможно, вам нужно «установить», затем включить функции в php.ini, наконец вам нужно добавить расширение в Apache Directori (symlink также выполнил бы работу) 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 

С другой стороны, я использую forking для многих проектов, и это действительно отлично подходит для оптимизации большинства из них, однако есть ошибка при злоупотреблении им с apache, im в основном разветвляя раздвоенного ребенка и делая что-то вроде хардкор, и он работает … довольно хорошо, но под нагрузкой он работает некоторое время, прежде чем начать создавать зомби-процесс, я могу управлять процессом зомби, используя «pcntl_signal (SIGCHLD, SIG_IGN)»; который в основном будет удалять этот процесс, как только ребенок закончит свою задачу, это немного поможет, а затем, когда apache сойдет с ума, и начнет пронизывать себя и, наконец, сбой вашего сервера, я не могу объяснить это поведение (пока, но я буду) это дерево weir / evil, созданное apache, можно увидеть только из «ps», ни из состояния сервера, ни из архива apache, и я сказал дурное дерево, потому что он в основном создает сотни процессов с детьми детей …

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

Вилка с apache будет работать? Да, конечно

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

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

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