Verbindungssteuerung
PHP erhält intern einen Verbindungsstatus. Dieser kann vier
Zustände annehmen:
- 0 - NORMAL
- 1 - ABORTED
- 2 - TIMEOUT
- 3 - ABORTED und TIMEOUT
Wenn ein PHP-Skript aktiv ist, ist der Status üblicherweise
NORMAL. Sollte der Client-Rechner die Verbindung beenden, wird
der Status auf ABORTED gesetzt. Ein clientseitiges Beenden der
Verbindung wird für gewöhnlich veranlasst, wenn Benutzer den
STOP-Button des Browsers drücken. Wenn das eingestellte Zeitlimit
(siehe set_time_limit()) überschritten wird,
wird der Status TIMEOUT gesetzt.
Sie können entscheiden, ob der Verbindungsabbruch seitens des Clients
den Abbruch des Skriptes zur Folge haben soll.
Manchmal ist es sinnvoll, Skripte sauber zu beenden, auch wenn
kein Browser mehr zur Verfügung steht, der die Ausgabe empfängt.
Die Abarbeitung eines Skriptes wird standardmäßig abgebrochen, wenn
der Client die Verbindung beendet.
Dieses Verhalten kann sowohl durch die Option
ignore_user_abort in
der Konfigurationsdatei php.ini, durch die entsprechende
Option php_value ignore_user_abort
in der Apache-Konfigurationsdatei
httpd.conf als auch durch ignore_user_abort() beeinflußt
werden.
Wenn PHP nicht angewiesen wird, einen Verbindungsabbruch durch den
Benutzer zu ignorieren und die Verbindung dann durch den Benutzer
beendet wird, wird die Abarbeitung des Scriptes abgebrochen. Die einzige
Ausnahme ist, wenn durch die Funktion
register_shutdown_function() eine Shutdown-Funktion
angegeben wird, die bei clientseitigem Abbruch ausgeführt wird.
Wenn dann der Benutzer den STOP-Button seines Browsers drückt, wird
PHP bei der nächsten Ausgabe des Skriptes feststellen, dass die
Verbindung abgebrochen wurde und die Shutdown-Funktion aufrufen.
Diese Shutdown-Funktion wird auch aufgerufen, wenn das Skript auf
normalem Wege beendet wird, daher sollte man, wenn man für den
Fall eines Benutzerabbruchs etwas anderes vorgesehen hat,
die Funktion connection_aborted() verwenden.
Sie gibt true
zurück, wenn die Verbindung abgebrochen wurde.
Ein Skript kann ebenfalls durch den eingebauten Script-Timer
beendet werden. Der Standard-Timeout beträgt 30 Sekunden. Er kann
durch die Option max_execution_time in der php.ini,
durch den entsprechenden Eintrag
php_value max_execution_time
in der
Apache-Konfigurationsdatei httpd.conf oder durch die Funktion
set_time_limit() beeinflußt werden. Bei
Zeitüberschreitung wird das Skript beendet und, genau wie im obigen
Fall des Verbindungsabbruchs, eine registrierte Shutdown-Funktion
ausgeführt. Um zu überprüfen, ob es sich um einen Abbruch aufgrund
von Zeitüberschreitung handelt, kann die Funktion
connection_status() benutzt werden. Sie gibt
2
zurück, wenn es sich um eine Zeitüberschreitung
handelt.
Zu bemerken ist, dass der ABORTED- und der TIMEOUT-Status gleichzeitig
auftreten können. Dies ist möglich, wenn PHP angewiesen wird,
Benutzerabbrüche zu ignorieren. PHP wird feststellen, dass der
Benutzer die Verbindung abgebrochen hat, das Skript allerdings
läuft weiter. Sollte es dann das Zeitlimit erreichen, wird es
abgebrochen und eine Shutdown-Funktion, wenn definiert, wird
aufgerufen. Zu diesem Zeitpunkt kann man feststellen, dass
connection_timeout()
und connection_aborted() true
zurückgeben.
Diese beiden Statusmöglichkeiten können auch durch einen Aufruf
der Funktion connection_status() abgefragt
werden. Sie liefert ein Bitfeld des aktiven Status. Wenn
beispielsweise TIMEOUT und ABORTED aktiv sind, wird 3 zurückgegeben.