Что происходит, когда сервер находится в бесконечном цикле и клиент останавливается?

Я пытаюсь выяснить, как делается "разговор" между сервером и клиентом.

Итак, когда сервер генерирует бесконечный цикл, 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.