Kalle_B: Server aktualisiert Browser-Inhalt (nach Stunden)

Hallöle,

wie könnte eine Webseite bei Bedarf vom Server aktualisiert werden?

Mir ist bekannt, dass sich eine Webseite nach einer gewissen Zeit selbst wieder laden kann oder per AJAX beim Server anfragt.

Liegt vielleicht in der AJAX- Technik die gesuchte Möglichkeit? Etwa so, dass ich per AJAX beim Server anfrage. Der hat nichts Neues, antwortet also nicht, legt aber die Verbindungsdaten zum Browser in der Datenbank ab.

Der Browser wartet ,,,

Irgendwann (nach Stunden) hat der Server eine neue Information und das angestossene PHP-Programm holt sich die Verbindungsdaten und sendet.

Kann so etwas mit PHP realisiert werden?

LG Kalle

  1. Hi!

    [..]

    Irgendwann (nach Stunden) hat der Server eine neue Information und das angestossene PHP-Programm holt sich die Verbindungsdaten und sendet.

    Kann so etwas mit PHP realisiert werden?

    Nein, denn der HTTP-Server ist das "passive" Element bei dieser Client-Server-Kommunikation. Der Webserver reagiert nur auf einen Request seitens des Clients mit seiner Response.

    Die einzige Möglichkeit besteht darin, _client_seitig zu ermitteln, ob aktuellere (oder neue) Informationen auf dem Server vorliegen und ggf. diese abzurufen (z.B: per AJAX)

    off:PP

    --
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  2. Kann so etwas mit PHP realisiert werden?

    unwahrscheinlich

    a) müsstest du dein php-script-timeout auf mehrere stunden stellen und das script müsste in einer quasi-endlosschleife laufen

    b) müsste selbriges vom browser (javascript) erledigt werden - und auch der wird irgendwann einen timeout liefern, wenn ihm der webserver nach 2 stunden immer noch keine antwort geschickt hat

    was spricht gegen einen cron-job der die daten sammelt und bereitstellt und ein setTimeout welches, sagen wir alle 10 minuten, die neu abfrägt, obs denn was neues gibt?

    1. was spricht gegen einen cron-job der die daten sammelt und bereitstellt und ein setTimeout welches, sagen wir alle 10 minuten, die neu abfrägt, obs denn was neues gibt?

      Ich fragte nach einer anderen Technik, Daten _schieben_ statt ziehen.

      Das mit dem Timeout habe ich vermutet, aber neulich bei einem lang laufenden AJAX- Programm war der Browser sehr geduldig. Das brachte mich auf die Idee.

      Und die Frage, ob ich mit einem beliebigen PHP- Script einen "wartenden" Browser ansprechen kann, ist nicht beantwortet.

      LG Kalle

      1. Hi!

        Und die Frage, ob ich mit einem beliebigen PHP- Script einen "wartenden" Browser ansprechen kann, ist nicht beantwortet.

        Doch habe ich: es gibt keinen "wartenden" Browser(=Client), sondern nur "wartende" Server.

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      2. Moin.

        Ich fragte nach einer anderen Technik, Daten _schieben_ statt ziehen.

        Wähle ein passenderes Protokoll:
        http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol

        Grüße

        1. Hallo,

          Wähle ein passenderes Protokoll:
          http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol

          Wäre ein Protokoll nicht „passender“, wenn es vom Browser unterstützt wird?

          Tim

          1. Nabend.

            Wäre ein Protokoll nicht „passender“, wenn es vom Browser unterstützt wird?

            Yoh, wenn man es so sehen mag. Ich könnte jetzt aber auch das Beispiel YouTube anführen:
            Hätten die Jungs 2005 etwa besser gesagt "och nö, Flash ist Teufelszeug, wir lassen das mal lieber"?

            Grüße

            1. Hallo,

              Ich könnte jetzt aber auch das Beispiel YouTube anführen: Hätten die Jungs 2005 etwa besser gesagt "och nö, Flash ist Teufelszeug, wir lassen das mal lieber"?

              Hinkt etwas. ;)

              Sie hatten damals ja keine browserübergreifende, plugin-freie Alternative für Video. Für Server-Push existiert diese, wenn auch mittels Hacks.

              Tim

  3. Hi,

    Kann so etwas mit PHP realisiert werden?

    potenziell ja.

    Allerdings nicht in HTTP.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  4. ja, es geht, auch wenn einige hier behaupten, es ginge nicht.
    http://xulplanet.com/tutorials/mozsdk/serverpush.php

    1. Hallo,

      http://xulplanet.com/tutorials/mozsdk/serverpush.php

      Wäre eine Lösung nicht besser, die in Browser funktionieren würde?

      Tim

    2. Moin!

      ja, es geht, auch wenn einige hier behaupten, es ginge nicht.
      http://xulplanet.com/tutorials/mozsdk/serverpush.php

      Ok, dann lesen wir zuerst mal den roten Kasten ganz oben auf der Seite:

      "WARNING: Most of this content (with the exception of the Mozilla 1.9 XPCOM reference) is very old, and can be expected to be out of date and possibly obsolete. For better XUL documentation, please visit the XUL hub at the Mozilla Developer Center."

      Die Infos der Seite sind also alt, möglicherweise auch veraltet und mittlerweile unzutreffend.

      Mit dieser Info im Hinterkopf lesen wir:

      "The term 'server push' generally means that a server pushes content to the browser client. In reality, a browser doesn't allow this directly."

      Das ist genau die Aussage im bisherigen Thread. Der Server kann NICHT dem Client neuen Inhalt hinschieben, er muss warten, bis der Client wieder nachfragt.

      "However, it may be emulated in a number of ways."

      Wie im Thread ausgeführt.

      "The client polls the server at a certain interval, say every five minutes. This technique is typically used to update news information. The client does this by reloading a page every so often."

      Klassiker. Funktioniert. Der Server kann sich im Rahmen des Timeouts auch eine gewisse Zeit nehmen, um mit "nix" zu antworten, sollte während der Zeit nichts passiert sein. Frühere Antwort im Eventfall natürlich nicht ausgeschlossen.

      "The client uses the 'multipart/x-mixed-replace' content type when sending a response. The content type is expected to send a series of documents one after the other, where each one will replace the previous one. The server might delay between each part, which gives the illusion that the data is being updated after an interval. This technique requires a connection to stay open."

      Funktioniert nicht. Hat wohl mal in alten Netscapes funktioniert (ich hatte mal damit experimentiert, Netscape 4 war nach meiner Erinnerung schon zu neu!), aber wie man anhand des experimentellen Mimetyps sieht, ist das nie standardisiert worden und wird von aktuellen Browsern nicht unterstützt.

      "In Mozilla 1.6 and later, server sockets may be used to listen for incoming connections. This technique works similarly to the way a server would listen to connections from a browser and doesn't require a connection to be kept open. However, server sockets may only be used from privileged code."

      Funktioniert nur unsicher. Erstens: Braucht erhöhte Privilegien, es gibt also eine unschöne Sicherheitsmeldung im Browser, die der Benutzer erlauben muss. Zweitens: Der im Client geöffnete Port muss aus dem Netz auch erreichbar sein - dummerweise sind Firewalls und NAT sehr verbreitet, die den Verbindungsaufbau von "außen" (also dem Server) nach "innen" (zum Client) in der Regel verbieten.

      - Sven Rautenberg

      1. Funktioniert nur unsicher. Erstens: Braucht erhöhte Privilegien, es gibt also eine unschöne Sicherheitsmeldung im Browser, die der Benutzer erlauben muss. Zweitens: Der im Client geöffnete Port muss aus dem Netz auch erreichbar sein - dummerweise sind Firewalls und NAT sehr verbreitet, die den Verbindungsaufbau von "außen" (also dem Server) nach "innen" (zum Client) in der Regel verbieten.

        ich weiß nicht was du hast, geht bei mir einwandfrei hinter NAT und ohne fehlermeldung.

  5. Hallo,

    Liegt vielleicht in der AJAX- Technik die gesuchte Möglichkeit?

    Ja mit Comet, wobei die Technik eher eine Hack oder eher eine Vergewaltigung von AJAX und HTTP ist. Es wird vom Browser ein Request zum Server aufgebaut, der dauernd läuft, also nie beendet wird. Eine Übersicht über mögliche Techiken findest Du hier. Der Server wartet dann und meldet sich irgendwann zurück. Das Ganze ist auf  der normalen Server-Architektur recht ressourcenintensiv, das Skript läuft andauernd und es besteht meistens andauernd eine Verbindung zwischen Browser zu Server, d.h. Verbindungen werden irgendwann Mangelware. Es gibt darauf spezialisierte Server wie der cometd-Familie, woran Du erkennen kannst, dass das eher dort benutzt wird, wo man mit mehren Webservern hantiert, volle Kontrolle über seine server-seitige Software hat und auf Client-Seite auch größere Frameworks wie z.B. Dojo benutzt. In fernerer Zukunft spezifiziert HTML 5 eine weitere Möglichkeit, die aber noch nicht in Browsern und auch nicht in Servern unterstützt wird.

    Für die normalen private Webseite auf Feld-, Wald- und Wiesen-Webhostern ist das viel zu übertrieben. Anstatt serverseitigen Push empfiehlt sich da eher Pull, wenn es nicht in Echtzeit ähnlicher Geschwindigkeit sein muss. Einfach alle x Zeitabstände mit XMLHttpRequest einen neuen Request stellen und gucken, ob was neues da ist. Mit setInterval() kann man das dann in einem Interval wiederholen. Gängige Javascript-Bibliotheken bieten dafür leicht nutzbare Objekte wie z.B. Ajax.PeriodicalUpdater in Prototype. Es ist aber auch keine Raketenwissenschaft, sich das schnell selber zu basteln. Empfehlenswert wäre vielleicht auch noch eine logarithmische Skala für das Interval.

    Tim