PHP w ogóle nie wykrywa przerwania połączenia
Przeczytałem i głęboko to zrozumiałem:http://www.php.net/manual/en/features.connection-handling.php http://www.php.net/manual/en/function.register-shutdown-function.php
Przetestowałem jednak zarówno PHP 5.1.6, jak i 5.3, a rzeczy NIE działają zgodnie z opisem. To, co obserwuję, to:
connection_status () zawsze zwraca true, nawet po zamknięciu połączenia przez klienta.wykonanie skryptu kontynuuje się po zamknięciu połączenia przez klienta, mimo że ignore_user_abort ma wartość 0funkcja zarejestrowana za pomocą register_shutdown_function () nie jest uruchamiana, dopóki skrypt nie osiągnie końca. Skrypt NIE jest przerywany (i stąd funkcja nie jest wywoływana), gdy klient przerwie połączenie.Więc w zasadzie PHP po prostu nie wykrywa rozłączenia klienta WSZYSTKO.
Zauważ, że NIE jest to tak, jakby ignore_user_abort było ustawione na 1: jeśli tak było, to connection_status () zwróci 1, nawet jeśli skrypt będzie działał, a funkcja zamykania nie będzie wywoływana do końca. Tak nie jest.
ini_get („ignore_user_abort”) zwraca 0, zgodnie z oczekiwaniami.
Czy jest to błąd w PHP, czy może jest to spowodowane ustawieniem Apache?
Jak sprawić, by PHP działało zgodnie z opisem w wyżej wymienionej dokumentacji?
Skrypt testowy:
<?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 ".";
}
?>
Kroki do odtworzenia: - odwiedź adres URL skryptu - przerwij połączenie na kliencie przed upływem 10 sekund (np. Naciśnij przycisk zatrzymania w przeglądarce)
Oczekiwane / pożądane zachowanie: Dzienniki powinny pokazywać mniej niż 10 kropek, a na końcu „myShutdown 1 0” (jeśli oglądasz dziennik w czasie rzeczywistym, myShutDown powinien pojawić się natychmiast, gdy klient rozłączy się)
Obserwowane / bieżące zachowanie: dzienniki pokazują zawsze dokładnie 10 kropek, a na końcu „myShutdown 0 0” (jeśli oglądasz je w czasie rzeczywistym, to trwa 10 sekund bez względu na to, kiedy klient się rozłączy).