PHP Abbruch von Ajax Request erkennen

major-crab

Cadet 2nd Year
Registriert
Juli 2010
Beiträge
19
Hallo,

ich baue mit Hilfe von jQuery.ajax() eine Long Polling Verbindung zu einer PHP-Datei auf dem Server auf.
Meine Frage ist jetzt, ob ich serverseitig in dieser PHP-Datei überprüfen kann, ob die Long Polling Verbindung noch besteht, oder ob der Request vom Client abgebrochen wurde.
Der Request kann in meinem Fall nur vom Client beendet werden und ich muss serverseitig genau wissen, wann das geschieht.
 
das wirst du mit php nicht schaffen können, denke ich zumindest.
PHP wird nur einmal ausgeführt und dann beendet, ich glaube man kann nur von php zum clienten ne socket verbdinung aufbauen, nicht umgekehrt.

Hatte aber vor kurzem mit dem selben problem zu kämpfen und bin jetzt bei NodeJS gelandet in verbindung mit SSE (server-side-events)

mit NodeJS kannst direkt in JavaScript einen kleinen webserver schreiben der dann mit php kommuniziert.
Hier z.b. die verbindung überwacht und wenn diese abbricht wird an php gesagt: Ey,die verbinung ist weg und der kann das zudem auch noch ein event an den clienten senden, also ein push erzeugen.

auch wenn du kein event benötigst kann man das sicher verwenden, eben new <eventSource() statt jQuery.ajax() oder direkt mit einem websocket implementieren, auch wenn das schon eine ecke schwerer wird

Andere überlegung:
Wieso kannst du die verbindung nicht aif client seite beobachten und bei einem abbruch halt an den server schicken?
Ist nicht mehr ganz sicher aber nen schneller(er) workaround
 
Zuletzt bearbeitet:
Ich hatte nur gehofft, dass ich es auch ohne eine neue Technologie hinbekomme, aber das mit Node.js hört sich ja eigentlich ganz gut an. Damit erzeugt man dann auch einen echten Server-Push. Ich werde mir die Alternativen mal anschauen.

Zu der Überlegung: Die Verbindung auf Client-Seite zu überprüfen ist theoretisch möglich, nur leider auch sehr unsicher. Wenn z.B. die Internet-Verbindung auf Client-Seite plötzlich wegfällt, kann der Client kein Signal mehr an den Server schicken und der Server denkt weiterhin, die Verbindung zum Client besteht, da er kein Signal bekommen hat.
 
Wie wäre es mit Websockets in PHP und Java-Skript? Das sollte einwandfrei klappen. ;-)
 
Man sollte PHP nicht zu etwas missbrauchen, wofür es nicht gedacht wurde. PHP ist nach dem Request-Response-Modell mit kurzer Laufzeit gedacht. Long-Polling oder Websockets da reinzufrickeln ist einfach nur absolut lächerlich. Zumal man irgendwie auch erst an die Daten zum Weiterleiten kommen muss, soll man in einer while-Schleife die Datenbank abfragen? :lol:

Für sowieso nimmt man eine Software, die stark auf ein Event-Modell aufbaut oder wenigstens Threading kann. Node.js ist einfach eine super Empfehlung, da es total simpel ist und nichtmal eine neue Sprache gelernt werden muss und man die Aufgabe trotzdem in 200 Zeilen Code lösen kann.
 
Ich glaube ich habe hier die Lösung gefunden: http://de3.php.net/connection_aborted

Node.js ist wirklich eine interessante Sache, aber halt auch sehr umfangreich, da man nicht mehr mit Apache arbeiten kann. Ich brauche Long Polling nur an einer Stelle im Projekt, deshalb hoffe ich, dass ich es auch so lösen kann.
 
Hast dir denn auch mal diekommebtare durchgelesen?

gerade das zweite ist interessant:
In order to detect a disconnection inside the script we need to flush the buffer (it is only when the the server tries to send the buffer content that it will see that the connection is broken).

Thus we need to use the ob_implicit_flush() function to flush automatically the buffer

da ist aber auch code der allem anschein nach genau das tut was du willst.

trotzdem denke ich das es so probleme geben könnte.
du müsstest halt alles in einer schleife ausführen, ständig den OB leeren und prüfen ob dann gucken ob es beim clienten angekommen ist.

Könnte auch die laufzeit erhöhen.
 
man kann Node.js durchaus parallel zum Apache betreiben, du musst nur deine Ports entsprechend konfigurieren. Da darf Node.js eben nicht auf der 80 lauschen und deine Anfragen, die an Node.js gehen sollen, müssen gezielt an den Port geschickt werden.

Ich überleg nur, ob die connection-Geschichte überhaupt funktioniert, zumindest in ner Shared Hosting - Umgebung. Meist läuft das über mod_suphp, bei dem jede Anfrage einen neuen Prozess startet und am Ende wieder tötet. Ich glaube, da gibts keine permanenten Verbindungen.
 
wie ich das verstanden habe, prüft connection_aborted bei jedem versuch daten an de clienten zu senden, also den buffer zu leeren ob eine verbindung aufgebaut werden kann. Theoretisch könnte es also funktionieren.
Es wird ja nur ein Script aufgerufen?
Mab muss nur regelmäßig den buffer leeren, es kann dann aber natürlich sein, das eine operation ausgeführt wird und erst nach beenden registriert wird, das die verbindung gar nicht mehr vorhanden ist!

Außerdem muss man die max exceution time beachten.
Standartmäßig ist nach 30 sekunden schluss und das script schmiert unverrichteter dinge ab :-/

Auch wenn du es nur einmal benötogst scheint mir das ne suboptimale lösung zu sein, kannst vlt, ein wenig geauer beschreiben was du versuchst?

NodeJS un Apache lassen sich btw. perfekt nebenher betreiben :)

den clienten warten lassen und ggf. eine antwort schicken erscheint mir sonnvoller.
So richtest du ja "quasi" einen webserver für jeden clienten ein.

@Daaron: bleibt die verbindung nicht erhalten, bis php sagt: nu ist feierabend, ich habe nichts mehr zum senden?
 
Zuletzt bearbeitet:
Jap, die max_execution_time killt sämtliche Pläne, effizient via PHP einen Polling-Dienst anzulegen. Wenn man sie auf 0 stellt kann jedes Script zwar ewig laufen, dafür ersäuft der Server irgendwann in seinen Aufgaben. Dafür ist PHP einfach nicht gedacht, max_execution_time = 0 sollte nur im CLI-Modus eingesetzt werden.
Es gibt für parallele, eventbasierte Anfragen einfach bessere Lösungen als Apache/PHP.
 
Zurück
Oben