Christoph Zurnieden: HTTP-Request abbrechen

Beitrag lesen

Hallo,

Also, der User löst durch einen Klick (o.ä.) in seinem Browser einen HTTP-Request auf dem Server aus,
der startet daraufhin einen evtl. aufwendigen CGI-Prozess.
Jetzt klickt der User irgendwo anders hin, braucht das Ergebnis also gar nicht.
Könnte man mittels Javascript den alten Request canceln und damit den Server entlasten?

Viel zu aufwendig. Eine TCP-Verbindung lässt sich ohne weiteres mittendrin abbrechen und der Eigentümer (hier: der Webserver) der Verbindung wird darüber automatisch informiert.

Da würde ich jetzt aber gerne wissen, wie Du die Ausführung des TCP unterbrechen willst und zwar ohne Eingriffe in's OS oder den Stecker raus zu ziehen.
Nur mit dem Browser?

Du musst nur dafür sorgen, daß Dein Skript auf dieses Ereignis reagiert. PHP bricht beispielsweise (zumindest in der Modulversion) ein Skript standardmäßig ab, sobald es versucht, in eine bereits geschlossene Verbindung zu schreiben (lässt sich aber ändern, http://www.php.net/manual/de/features.connection-handling.php). mod_fastcgi macht's ähnlich und signalisiert dem Prozess das Verbindungsende (http://www.fastcgi.com/docs/faq.html#Signals).

Aha.
Nun ist aber nach dem Absenden des Requests schon Ende.
Bei einem unvollständigem (Timeout) oder abgebrochenem Request startet das CGI o.ä. gar nicht erst.
Genau so beim Response: Wenn ein Response vorliegt, ist das CGI meist schon fertig. Gäbe ja sonst auch kein Ergebnis, das raus zu schicken wäre.
Die einzige Ausnahme wäre ein Stream, das läuft aber bei Audio/Video nicht unbedingt über das HTT Protokol und da ist ein Abbruch auch direkt vorgesehen und fest eingebaut.

Unter Umständen etwas hinderlich könnten allerdings Caches sein, die dafür sorgen, daß die Anfrage komplett ausgeführt wird, egal ob der Browser die Verbindung beendet hat oder nicht.

Was hat das mit Caches zu tun?
Bei meinem Beispiel mit der Volltextsuche wird diese angeschmissen und läuft getrennt vom HTTP. Die müßte man explizit anweisen aufzuhören. Das geht mit verschiedenen Methoden, die teilweise allerdings auch die Browser unterstützen müssen.

RFC 2616:
  HTTP implementations SHOULD implement persistent connections.
_______________________^^^^^^

Tja ...

Das hat aber durchaus seinen Sinn und Zweck und mit passender Nutzung von Expires oder Last-Modified bzw. If-Modified-Since kann man dank der Cache-Zwischenspeicherung eventuell auch die ein oder andere Abfrage zumindest mit der Meldung "Keine Änderung seit letztem Abruf" frühzeitig beenden oder sogar ganz verhindern.

Das ist eine empfehlenswerte zusätzliche Sicherungsmaßnahme, die aber auch nicht immer paßt. Mitunter gibt es nichts zu cachen.

so short

Christoph Zurnieden