Я прочитал и глубоко понимал их: http://www.php.net/manual/en/features.connection-handling.php http://www.php.net/manual/en/function.register-shutdown-function.phpPHP не обнаруживает подключение прерывания на всех
Однако я испытал как 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' больше не поддерживаются? – Baba
Вы используете php как модуль apache? – hek2mgl
@ hek2mgl yes, как модуль apache – matteo