PHP/Verbindungssteuerung

Aus Mikiwiki
< PHP
Version vom 6. Februar 2010, 20:32 Uhr von Michi (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

In den bisherigen Beispielen wurde jedes Skript einzeln aufgerufen; gleichzeitig zugreifende Nutzer erhalten jeweils eine neue Version. Auch derselbe Nutzer wird immer wieder ein "neues" Skript erhalten, was unkritisch ist, solange sich der Inhalt sowieso nicht ändert. Zur Wiedererkennung des Nutzers sind zusätzliche Anstrengungen notwendig.

Das verbindungslose Protokoll HTTP führt bei der praktischen Umsetzung von Webprojekten zu einigen Problemen, denn der Status eines Clients kann von grosser Bedeutung sein. Es gibt deshalb eine Reihe von PHP-Funktionen, die der Verbindungssteuerung (engl. connection handling) dienen.

Funktionsübersicht

Funktion Beschreibung
ignore_user_abort Verhindert, dass Nutzer mit dem "Abbruch"(Stop)-Schalter die Verbindung unterbrechen.
register_shutdown_function('shutdown') Registriert eine Rückruffunktion, die nach einem Abbruch oder dem Ende des Skripts aufgerufen wird. Die Funktion darf keine Ausgaben enthalten.
connection_aborted Stellt fest, ob die Verbindung unterbrochen wurde. Ist die Verbindung zum Client unterbrochen, wird "TRUE" zurückgegeben, sonst "False".
connection_timeout Stellt fest, ob es zu einem Abbruch aufgrund einer Zeitüberschreitung kam. Trifft das zu, so wird "TRUE" zurückgegeben.
connection_status Gibt alle Statuswerte zurück.
set_time_limit(seconds) Setzt die Zeitbegrenzung "seconds" in Sekunden, wenn der PHP-Interpreter nicht im sicheren Modus betrieben wird.

Verbindungszustände

Intern kennt PHP drei Zustände für Verbindungen.

Code Zustand Beschreibung
0 Normal (engl. normal) Zustand während der Abarbeitung eines PHP-Skripts.
1 Abgebrochen (engl. aborted) Zustand nach Abbruch durch den Client (durch Verlust der Verbindung oder Klick auf den "Abbrechen"-Schalter).
2 Zeitüberschreitung (engl. timeout) Wird die Ausführung des Skripts nicht innerhalb der normalen Zeitbegrenzung beendet, so unterbricht PHP die Ausführung und setzt den Status "Zeitüberschreitung.

Die Abarbeitung eines Skripts kann auch dann fortgesetzt werden, wenn der Client die Unterbrechung wünscht. Es erfolgt dann zwar trotzdem die Trennung und die gesendeten Daten werden im Webbrowser nicht mehr angezeigt, bestimmt Prozesse können aber im Skript sauber beendet werden. Dies gilt vor allem für Datenbankverbindungen, die häufig ausdrücklich geschlossen werden müssen, um Ressourcen freizugeben. Dazu wird in der Konfigurationsdatei "php.ini" die folgende Option gesetzt.

ignore_user_abort = On;

Alternativ kann auch die Funktion "ignore_user_abort" genutzt werden. Ohne Parameter wird der aktuelle Status zurückgegeben. Mit Parameter wird der aktuelle Wert gesetzt.

$status = ignore_user_abort();
ignore_user_abort(1);

Abbruchkontrolle

Eine Verbindung wird durch physische Trennung der Leitungen, Abbruch durch den Nutzer oder Ablauf der Zeitbegrenzung (der Standardwert beträgt 30 Sekunden) unterbrochen.

Mit der Funktion "register_shutdown_function" wird der durch den Nutzer provozierte Abbruch registriert. Beim nächsten Start des Skriptes kann so festgestellt werden, ob vorher ein Abbruch erfolgte. Als Argument wiord der Name einer Funktion übergeben, die im Falle eines Abbruchs ausgeführt wird. Die Funktion darf keine Ausgaben mehr an den Webbrowser senden. Der Befehl "echo" und die Funktion "print" sind ebensowenig erlaubt wie die Nutzung von "setcookie".

Eine primitive Möglichkeit wäre das Registrieren eines Abbruchs in einer besonderen "Abbruchdatei". Dafür könnte eine Session-ID in eine Datei geschrieben und beim nächsten Start des Skripts durch denselben Nutzer darauf reagiert werden.

Stattdessen könnte auch die Funktion "connection_aborted" abgefragt werden.

Begrenzen der Verbindungszeiten

Mit der Funktion "set_time_limit" kann die Zeitbegrenzung gesetzt werden. Die Funktion "connection_aborted" wird "TRUE" und eine zuvor registrierte Shutdown-Funktion wird ausgeführt. Damit zwischen einer Zeitüberschreitung und einem provozierten Abbruch unterschieden werden kann, wird die Funktion "connection_timeout" getestet.

Die Zustände "Abgebrochen" und "Zeitüberschreitung" können gleichzeitig auftreten. Das kann vorkommen, wenn das Unterbrechen eines Skripts durch den Nutzer mit der Funktion "ignore_user_aborts" verboten wurde, der Nutzer den Abbruch aber dennoch verlangt hat. Dann wird das Skript weiter ausgeführt, läuft möglicherweise bis zur Zeitüberschreitung und setzt dann beide Zustände. Für die Überweachung eignet sich die Funktion "connection_status", mit der alle drei möglichen Zustände gleichzeitig abgefragt werden können. Die Darstellung erfolgt in Form eines Bitfelds, wenn "Abgebrochen" (1) und "Zeitüberschreitung" (2) aktiv sind, wird 3 zurückgegeben.

Ausführungssteuerung

Die Ausführung von Skripten lässt sich vielfältig beeinflussen. Zum Beenden sind bereits die Befehle "die" und "exit" bekannt.

Die Ausführung kann aber nicht nur unterbrochen, sondern auch verzögert werden. Dazu werden die Funktionen "sleep" oder "usleep" eingesetzt - der einzige Unterscgied zwischen ihnen ist die Grössenordnung des Parameters. "sleep" erwartet die Angabe in Sekunden, "usleep" dagegen Mikrosekunden. Die beiden folgenden Angaben sind also gleichwertig.

sleep(3);
usleep(3000000);