почему Apache / сервер умирает, когда я делаю опечатку и вызывает бесконечный цикл? - PullRequest
1 голос
/ 16 ноября 2010

это более фундаментальный вопрос о том, как работает Apache / Threading.в этой гипотетической (читай: иногда я сосу и пишу ужасный код) я пишу некоторый код, который входит в фазы бесконечной рекурсии своей жизни.то, что ожидается, происходит.подача останавливается.

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

Может кто-нибудь объяснить мне этот процесс?У меня есть php runtime для параметра «ignore_user_abort», установленный в значение «true», чтобы разрешить запуск вызовов ajax, которые инициируются, даже если они закрывают свой браузер, но будет ли это значение false влиять на него?,не знал, что искать.спасибо.

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

ignore_user_abort() позволяет вашему сценарию (и Apache) игнорировать отключение пользователя (закрытие браузера / вкладки, удаление со страницы, нажатие ESC, esc ..) и продолжение обработки. Это полезно в некоторых случаях - например, в корзине покупок, когда пользователь нажимает кнопку «Да, разместите заказ». Вы действительно не хотите, чтобы заказ умер в середине процесса, например заказ находится в базе данных, но платеж еще не отправлен в платежную систему. Или наоборот.

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

Если это бесконечный цикл, вам придется подождать, пока собственное максимальное допустимое время выполнения PHP (set_time_limit() и max_execution_time()) включится и убьет скрипт , Есть также некоторые ограничители на стороне сервера, такие как Apache RLimitCPU и TimeOut, которые могут обрабатывать подобные ситуации.

Обратите внимание, что кроме Windows, PHP не считает "внешнее" время в set_time_limit. Поэтому, если ваш процесс запуска выполняется в базе данных, вызывая внешние программы с помощью system() и т. П., Время, потраченное на выполнение этих внешних вызовов, НЕ учитывается в родительском ограничении времени.

0 голосов
/ 16 ноября 2010

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

Решение: не пишите код, который не завершается (в разумные сроки).Понять инварианты цикла.

...