Является ли процесс разветвления в PHP / Apache хорошей идеей? - PullRequest
7 голосов
/ 25 ноября 2008

Я пишу простое приложение на PHP, которое должно время от времени выполнять довольно интенсивный набор обновлений MySQL. Я не особо хочу, чтобы это вызывало задержку для пользователя, поэтому мне интересно использовать pcntl_fork ().

Я не уверен, как это действительно работает: будет ли продолжаться дочерний процесс после завершения родительского процесса? Завершится ли родительский процесс и загрузится ли страница пользователя полностью до завершения дочернего процесса?

Другими словами, это безопасный способ заставить PHP-скрипт (работающий под Apache) выполнять некоторые трудоемкие обновления, не задерживая пользователя, или я должен просто попросить своих пользователей смириться с некоторой задержкой?

Ответы [ 4 ]

3 голосов
/ 25 ноября 2008

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

1 голос
/ 25 ноября 2008

Кто-то может, вероятно, подробно рассказать вам, что происходит, когда вы звоните в Apache, но есть вероятность, что вы получите ответы, которые не всегда верны, в зависимости от того, какие версии и комбинации apache и php вы используете. Вы должны использовать ajax и иметь два запроса. Ответьте один раз со страницей, которая говорит о том, что вы делаете, а затем с помощью ajax-запроса выполните второй запрос о статусе и месте, где вы фактически выполняете работу.

0 голосов
/ 02 августа 2012

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

0 голосов
/ 24 июля 2012

Если PHP работает под Apache, так как разветвление модуля mod_php не будет работать вообще, вы получите предупреждение о том, что функция * pcntl_fork () * не определена. В этом случае хорошим решением будет использование exec () вместо запуска отдельного задания php с помощью командной строки.

...