Я пытаюсь понять, как делается «разговор» между сервером и клиентом.
Итак, когда сервер генерирует бесконечный цикл, например, "hello<br />"
, что происходит, когда клиент останавливается или обращается «назад»?
Как сервер знает, что это конец цикла, или он берет на себя бесконечный процесс?
Есть ли где-нибудь, что я могу прочитать об этом, чтобы получить общую картину?
Клиент имеет сеанс 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()
Даже если ваш php-скрипт имеет бесконечный цикл, php.ini имеет max_execution_time
которое убьет процесс, если время превысит.
Я не уверен, как это будет работать, когда клиент закрывает соединение. Apache может убить процесс, но я не думаю, что PHP будет уведомлен о закрытии соединения клиента.
Если вы set_time_limit(0);
в сценарии (поэтому интерпретатор PHP позволяет ему работать вечно), тогда скрипт, вероятно, будет работать до тех пор, пока веб-сервер не убьет его после того, как будет установлена переменная TimeOut
(по умолчанию мне кажется, что 300 секунд, и, насколько я знаю, только настройка Apache).
См . Документы Apache для директивы TimeOut .