obiwan1973: Mit JS prüfen: Existiert PHP-Session / Ist Webserver erreichbar?

Hallo zusammen,

wie frage ich am besten per JavaScript ab, ob die HTTP- bzw. PHP-Session noch existiert bzw. ob der Webserver oder eine bestimmte PHP-Seite erreichbar ist?

Ich möchte Euch auch den Kontext erklären:
Es geht um eine browserbasierte Intranet-Anwendung, die in einem WLAN läuft.
Die Clients sind normale Android Smart Phones, als Browser benutzen wir Firefox Mobile bzw. Opera Classic.

In diesem WLAN kommt es häufig zu Netzverbindungsabbrüchen.
Daran kann ich leider nichts ändern, ist nicht mein Zuständigkeitsgebiet, also bitte, bitte nicht rumschimpfen, bringt keinem was ...

Ich möchte in meiner Anwendung per JS kontrollieren, ob die Sitzung noch existiert und wenn NICHT, die komplette Anwendung re-starten.

Das Re-Starten ist übrigens technisch kein Problem.
1a programmiert, funktioniert fehlerfrei und ist tausendfach bewährt.

Auch Datenverlust habe ich bei meiner Anwendung ausgeschlossen - alle Änderungen in der GUI durch den User werden in einem stationären Cookie gespeichert - und zwar nach jedem Klick.

So, jetzt kommt's:
Ich habe auch bereits so etwas wie einen "Heartbeat" in JS programmiert.
Naja, ist eigentlich mehr als nur JS: JS, PHP, SQL.

Ich habe in meiner Anwendung einen unsichbaren Iframe (nennen wir ihn Iframe1).
Der wiederum enthält einen zweiten Iframe (Iframe2).

Nun arbeitet in Iframe1 ein JS-Script.
Mit window.setTimeout bzw. window.setInterval lasse ich in einem festen Intervall in Iframe2 eine PHP-Seite - nennen wir sie test.php - ständig neu laden.

So sorge ich dafür, dass die Verbindung zwischen Client und Server nicht einschläft.

Außerdem tut die aufgerufene PHP-Seite test.php in Iframe2 noch etwas ganz anderes:
Sie schreibt bei jedem Aufruf mit SQL einen Timestamp in meine Log-Tabelle.
So weiß ich ganz nebenbei (in ungefähr), wie lange der User online war (für den Fall, dass er sich nicht ordnungsgemäß ausgeloggt hat).

Nun möchte ich diesen "Heartbeat" aufbohren:
Wenn die test.php nicht - oder nicht ordnungsgemäß - geladen werden kann, möchte ich meine komplette Anwendung re-starten.
So will es der Boss haben.

Okay, wie mache ich das am geschicktesten?

Ich könnte in die ständig neu geladene Unterseite test.php einfach ein HTML-Textfeld mit einem von PHP erzeugten Timestamp einbauen.

In Iframe1 könnte ich mit JS abfragen, ob das Textfeld in Iframe2 existiert und wenn ja, ob der Timestamp im Feld halbwegs aktuell ist.

Hat jemand bessere Ideen?

Ich finde, so müsste ich nicht etwas ganz neues programmieren, mit viel Aufwand etc.

Es sei denn, es gibt was viel besseres, was mit überschaubarem Aufwand machbar ist?

Und nochmal: Am WLAN kann ich nichts ändern. Sorry, da hilft kein Heulen und kein Fluchen.

Freue mich auf Input!

Gruß

Thomas

  1. Hola,

    ein Vorschlag

  2. Mahlzeit,

    wie frage ich am besten per JavaScript ab, ob die HTTP- bzw. PHP-Session noch existiert bzw. ob der Webserver oder eine bestimmte PHP-Seite erreichbar ist?

    Ich würde sagen, ein Request per Ajax und den Erfolg prüfen. Ein Ping ist mir unter JS nicht bekannt.

    --
    42
    1. Hola,

      Ping a server in javascript

      ist auch nur ein Vorschlag aus dem www!

  3. Hallo,

    wie frage ich am besten per JavaScript ab, ob die HTTP- bzw. PHP-Session noch existiert bzw. ob der Webserver oder eine bestimmte PHP-Seite erreichbar ist?

    Indem du per XMLHttpRequest einen Request absendest. Hier kannst du sehr einfach den Fehlerfall behandelt: timeout setzen, error-Event behandeln.

    https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#timeout
    https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests#Example.3A_using_a_timeout
    https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress
    http://www.w3.org/TR/XMLHttpRequest2/

    Mathias

  4. Hello,

    Ich möchte in meiner Anwendung per JS kontrollieren, ob die Sitzung noch existiert und wenn NICHT, die komplette Anwendung re-starten.

    Wer soll denn die Anwendung neu starten?
    Macht das der Client per RPC oder der Server per Kontrollfunktion (Cron-Job)?
    Wie lange darf ein Client abwesend bleiben?

    Das Problem ist immer das Protokoll. Man kann auf HTTP/s keine echten Sessions fahren sondern es nur umerziehen. Es werden aber immer "halboffne Verbindungen" bleiben. Der Server kann also beim Ausbleiben eines Heartbeats nicht beim Client nachfragen "bist Du noch da?".

    Ich hatte hier neulich schon mal eine "Prügelei" mit Matthias um diesen Themenkreis. Der hat mich aber gar nicht verstanden. Vielleicht komme ich ja dieses Mal einen Schritt weiter?

    Us obiger Aussage ergibt sich nämlich eine Idee, die bei heutigen Smartphones schon möglich sein könnte: "bidirektionales HTTP". Das bedeutet, dass beide Hosts gleichzeitig einen Client und einen Server betreiben und die Applikation(en) dafür sorg(t|en), dass die gegenseitgen Requests und Responses zueinander finden. Man pflanzt dem HTTP also den wegoperierten Teil von TCP auf einer höheren Schicht wieder ein.

    Das System (nicht das Doppel-Protokoll) baut man typischerweise asysmmetrisch auf. Das bedeutet, dass die "Kernkompetenzen" und die Datenhaltung trotzdem beim stationären System verbleiben.

    Mit klassischen PCs haben wir sowas schon mal aufgebaut. Es hat so leidlich funktioniert. Für eine Fertigentwicklung für die Straße hat das Institut dann keine Mittel mehr gehabt.
    Mit App-Entwicklung kenne ich mich leider (noch nicht) aus. Ich kenne bisher leider auch kein Entwicklungssystem, das dieses Konstrukt untertützt. Aber wenn man sich die Protokolle nochmal ansieht als Grafik und sich dann selber ein Bild malt vom Gesamtkunstwerk, ist es plötzlich nicht mehr schwierig.

    Man spart sich damit den kurzen Heartbeat. Ein Puls pro Minute reicht i.d.R. dann. Jeder kann ja beim Anderen nachfragen: Bist Du noch da? Besteht unser Vertrag noch?

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com