Закрытие браузера и вопрос о сервере - PullRequest
1 голос
/ 06 февраля 2010

Откуда сервер знает, что я закрыл браузер в коде, подобном этому?

<?php
$i = 0;
while (1) {
    echo "a";
    flush();
    $fp = fopen("$i.txt", "w");
    fclose($fp);
    sleep(1);
    $i++;
}
?>

Если я закрываю браузер, скрипт останавливается и файлы больше не создаются.

1 Ответ

2 голосов
/ 06 февраля 2010

Это происходит потому, что при попытке вывести что-либо, например, echo "a"; flush();", PHP видит, что запрос был прерван, и поэтому останавливает запрос.

Просто короткая заметка. Это происходит только тогда, когда вы выводите что-то. Я предполагаю, что это связано с тем, что PHP в основном использовался для шаблонов и предназначен главным образом для вывода контента. Ну, а если контент никуда не денется, зачем продолжать обработку скрипта?

Если ты не хочешь, чтобы это прекратилось. Выполните одно из следующих действий:

Вариант A: ничего не выводить.

flush() и echo оба считаются выходами, наряду со многими другими функциями. PHP только проверяет, не завершился ли пользователь, когда он отправляет контент, поэтому, если ничего не выводится, он не будет проверен. Хотя это, вероятно, не так надежно, как ...

Вариант B: использовать ignore_user_abort(true)

Это обеспечит продолжение вывода сценария, даже если пользователь покидает страницу. Затем вы можете проверить с помощью connection_aborted(), чтобы выяснить, было ли прервано соединение.

Вы можете прочитать все это в Документация по обработке соединений PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...