molily: Aktion beim Beenden der Seite ausführen

Beitrag lesen

Hallo,

Ich kann zwar halbwegs programmieren, aber gerade die Kommunikation zwischen Client & Server ist teilweise noch ein wenig unklar für mich. Wenn ich einen Request an den Server stelle, wie kann ich dann einen PHP Code ausführen ohne dafür die Datei zu öffnen???

Die Ausführung von serverseitigen Programmen hat nichts damit zu tun, ob ein Browser ein HTML-Dokument darstellt, das z.B. ein PHP-Script generiert hat (was du als »Datei öffnen« bezeichnest).

Eine kleine Erklärung, wie das dynamische Web so funktioniert:

1. Der Webbrowser auf dem Client-Rechner verbindet sich mit dem Webserver einen HTTP-Request.

2. Der Webserver empfängt ihn und verarbeitet ihn.

3. Der Webserver schaut, ob der Anfrage eine Datei entspricht. Wenn das eine .php-Datei ist, führt er dieses Script aus.

4. Das Script kann nun alle möglichen serverseitigen Operationen durchführen (z.B. Datenbankabfragen) und erzeugt die Antwort an den Browser. Das Script kann alle möglichen Antworten erzeugen. In erster Linie erzeugt es HTML-Dokumente (Inhaltstyp text/html), es kann aber prinzipiell alle möglichen Daten zurücksenden (Bilder, PDF, Flash usw.). Es muss übrigens keine Antwort erzeugen. Es kann auch ablaufen und das tun, was es tun soll, ohne eine Ausgabe zu erzielen.

5. Die Scriptausführung wird beendet und der Webserver überträgt das Ergebnis, d.h. die Ausgaben des PHP-Scriptes, an den Webbrowser.

6. Der Webbrowser entscheidet nun, je nach Inhaltstyp der Antwort, was mit den empfangenen Daten zu tun ist. Wenn es ein HTML-Dokument ist, kann er es selbst darstellt, wenn es eine Grafik ist, meistens auch, ansonsten wird ein Plugin aufgerufen oder ein Download-Dialog angezeigt.

Nur die Schritte 1 und 6 sind die, wo der Browser eine aktive Rolle spielt.
Die restlichen sind serverseitige Prozesse, die automatisch ablaufen, sobald der Webserver den Request entgegengenommen hat.

Was du jetzt machen willst (soweit ich dich verstehe), ist im Hintergrund Daten an den Server zu übermitteln, indem du einen Request auslöst. Deinem Beispiel entnehme ich, dass du ./dauer.php mit dem Parameter dauer=irgendwas aufrufen willst.

Gut, mit
   (new Image).src = "./dauer.php?dauer=" + param;
kannst du einen Request auslösen und den Wert der JavaScript-Variablen »param« als Wert für den Parameter »dauer« übermitteln. Es wird dann die obige Schritte durchlaufen: 1., 2., 3., 4. und wahrscheinlich 5.

Der Witz ist halt, dass dieser Request im Hintergrund passiert: Der Browser macht nichts mit der Serverantwort, er speichert sie lediglich. Wenn es ein Bild ist, kann man es dann ins Dokument einbauen und erst dann wäre es sichtbar.

Wenn du nun bei onunload diesen Request auslöst, dann wird höchstwahrscheinlich zumindest der Schritt 1 durchgeführt. Sprich, der Browser sendet den Request ab.

Wie gesagt sind damit Prozesse auf der Serverseite und die gewünschte Scriptausführung angestoßen. Was danach auf der Browserseite passiert, ist völlig egal! Schritt 6 muss nicht eintreten. Und er findet auch nicht statt, denn meist hat der Browser zu dem Zeitpunkt schon längst die Verbindung zum Server gekappt oder der gesamte JavaScript-Kontext, in dem du new Image aufgerufen hast, wurde schon verworfen. Oder der Browser ist insgesamt schon längst geschlossen. Wenn dann eine Antwort kommt, läuft sie ins Leere.

Hauptsache ist, dass das Script dauer.php mit dem Parameter angestoßen wird. Das Script soll, soweit ich dich verstehe, ja sowieso nichts anderes tun, als die übergebenen Daten speichern - es muss eh keine Antwort zurücksenden.

Warum, es soll doch auch mit Opera richtig funktionieren.

Lies. bitte. mein. Posting.  Danke.

Mathias