Я прочитал и глубоко понял это: http://www.php.net/manual/en/features.connection-handling.php http://www.php.net/manual/en/function.register-shutdown-function.php
Однако я тестировал как PHP 5.1.6, так и 5.3, и все работает НЕ так, как там описано. Что я наблюдаю:
- connection_status() всегда возвращает true, даже после того, как клиент закрыл соединение.
- выполнение сценария продолжается после того, как клиент закрыл соединение, даже если ignore_user_abort равен 0
- функция, зарегистрированная с помощью register_shutdown_function(), не запускается, пока сценарий не завершится. Сценарий НЕ прерывается (и, следовательно, функция не вызывается), когда клиент разрывает соединение.
Таким образом, в основном PHP просто не обнаруживает отключение клиента ВООБЩЕ.
Обратите внимание, что это НЕ так, как если бы ignore_user_abort был установлен в 1: если бы это было так, то connection_status() вернул бы 1, даже если скрипт продолжал бы работать, а функция выключения не вызывалась бы до конца. Это не относится к делу.
ini_get("ignore_user_abort") возвращает 0, как и ожидалось.
Это ошибка в PHP или это может быть связано с какой-то настройкой Apache?
Как заставить PHP работать, как описано в вышеупомянутой документации?
Тестовый сценарий:
<?php
function myShutdown() {
error_log("myShutdown ".connection_status()." ".ini_get("ignore_user_abort"));
}
register_shutdown_function(myShutdown);
echo "Hi!";
error_log(" *** test/test *** ");
for ($i=0; $i<10; $i++) {
sleep(1);
error_log(".");
echo ".";
}
?>
Шаги для воспроизведения: - перейдите по URL-адресу сценария - прервите соединение на клиенте до истечения 10 секунд (например, нажмите кнопку «Стоп» в браузере).
Ожидаемое/желаемое поведение: журналы должны отображать менее 10 точек и в конце «myShutdown 1 0» (если вы смотрите журнал в режиме реального времени, myShutDown должен появиться сразу после отключения клиента)
Наблюдаемое/текущее поведение: журналы всегда показывают ровно 10 точек и в конце «myShutdown 0 0» (если вы смотрите это в реальном времени, это продолжается в течение 10 секунд независимо от того, когда клиент отключается).
PHP
, которая больше не поддерживается? - person Baba   schedule 13.04.2013