Что происходит, когда сервер находится в бесконечном цикле и клиент останавливается?
Я пытаюсь выяснить, как делается "разговор" между сервером и клиентом.
Итак, когда сервер генерирует бесконечный цикл, echo
ing "hello<br />"
, например, что происходит, когда клиент останавливается или обращается "назад"?
Как сервер знает об этом в конце цикла или он принимает бесконечный процесс на своей стороне?
Есть ли где-нибудь, что я могу прочитать об этом, чтобы получить общую картину?
Ответы
Ответ 1
Клиент (браузер) установил сеанс TCP/IP с вашим сервером, ожидая ответа HTTP вашего сайта. Когда пользователь нажимает назад/отменить/закрыть, это TCP-соединение немедленно закрывается клиентом.
Веб-сервер (то есть apache) сообщит интерпретатору PHP о закрытии соединения TCP.
Если директива php.ini
ignore_user_abort
не установлена в 1
(на стороне сервера, 0
по умолчанию PHP), интерпретатор PHP затем прервет выполнение скрипта, когда закончится текущая атомарная операция (в вашем примере: echo()
)
Однако даже если вы явно установите ignore_user_abort
1
вы попадете в PHP max_execution_time
или в apache TimeOut
(оба настраиваются и на стороне сервера)
также смотрите ignore_user_abort()
и set_time_limit()
Ответ 2
Даже если ваш php script имеет бесконечный цикл, php.ini имеет max_execution_time
, который будет убивать процесс, если время превышает.
Я не уверен, как он будет работать, когда клиент закрывает соединение. Apache может убить процесс, но я не думаю, что PHP будет уведомлен о закрытии клиентского соединения.
Ответ 3
Если вы выполняете set_time_limit(0);
в script (поэтому интерпретатор PHP позволяет ему работать вечно), то script, вероятно, будет работать до тех пор, пока веб-сервер не убьет его после того, как долго переменная TimeOut
будет установлена на (по умолчанию я думаю, что до 300 секунд, и насколько я знаю, это только параметр Apache).
См. Документы Apache для директивы TimeOut.