Server-Push funktion ?
Marco Mühleis
- programmiertechnik
Hallo ! Ich suche eine Möglichkeit, einem Client mitzuteilen, dass ein neuer Datensatz auf dem Server liegt, der doch bitte abgerufen werden soll.
Beispiel: Eine Firma verkauft etwas und hat in ihrem Laden immer einen Webbrowser offen.
Sobald ein Kunde nun eine Bestellung tätigt, soll praktisch auf dem Rechner der Firma eine Meldung angezeigt werden, dass eine Bestellung eingetroffen ist und die Firma nun die Möglichkeit hat, praktisch innerhalb von Minuten die Bestellung zu bestätigen.
Ich programmiere in PHP / SQL.
Grundsätzlich wäre ein Meta-Reload denkbar, ich möchte jedoch verhindern, dass der Server 100 mal am Tag eine SQL Abfrage macht und somit den Server verlangsamt.
Mich interessieren Eure Ideen. Gibt es vielleicht ein einfach anzupassendes Java-Tool oder sowas ?
Vielen Dank vorab für Eure Antworten :-)
Marco
Hallo,
Hallo ! Ich suche eine Möglichkeit, einem Client mitzuteilen, dass ein neuer Datensatz auf dem Server liegt, der doch bitte abgerufen werden soll.
Mich interessieren Eure Ideen.
Server-Push ist in HTTP nicht vorgesehen.
Die Idee, die mir sofort einfiele, wäre in regelmäßigen Abständen mittels Javascript den Server abzufragen, ob man neu laden darf. Das setzt natürlich voraus, dass Deine Zielgruppe überschaubar ist, d.h. Du davon ausgehen kannst, dass Javascript im Browser verfügbar ist und dass der Server Ahnung vom Zustand der Webseite im Browser hat, d.h. weiss dass die Seite jetzt neu laden darf.
Konkret rede ich von dem (ursprünglich proprietären) Javascript-Objekt XMLHttpRequest, das inzwischen in den meisten Browsern verfügbar ist. Damit kann man aus Javascript hinaus HTTP Requests absetzen und hat dann Zugriff auf das (bei erfolgreichem Request) zurück gelieferten XML-Dokument oder dessen Textinhalt. Die Technik wird seit ein paar Monaten unter dem Namen AJAX gehypt, weil das einfacher zu tippen ist. Du solltest also dann in regelmäßigen Abständen mittels Javascript den Server fragen, ob ein neuer Datensatz da ist, am besten mittels eines eigenen PHP-Skriptes, das nicht die ganze, für die Seite benötigte SQL-Abfrage macht sondern nur den Zustand (wie auch immer der zustande kommt) abfragt. Wenn der Server dann eine positive Antwort liefert, lädt das Javascript entweder die Seite neu oder lädt wieder mittels XMLHttpRequest nur den bestimmten Datensatz und montiert diesen in die Seite ein. Also ungefähr dieselbe Art von Interaktivität, die eine „echte“ Anwendung auch liefert und die sich z.B. bei GMail oder Google Suggest beobachten lässt.
Das ganze ist natürlich nicht so sparsam wie es mittels eines echten Pushes wäre, schließlich wird doch in regelmäßigen Abständen ein Request abgesetzt, allerdings werden doch sehr viel weniger Informationen übertragen, als bei dem kompletten Neuladen einer Seite.
Eine kurze Einführung und Übersicht über die Benutzung von XMLHttpRequest gibt es z.B. hier:
http://developer.apple.com/internet/webcontent/xmlhttpreq.html
Tim
Moin!
Das ganze ist natürlich nicht so sparsam wie es mittels eines echten Pushes wäre, schließlich wird doch in regelmäßigen Abständen ein Request abgesetzt, allerdings werden doch sehr viel weniger Informationen übertragen, als bei dem kompletten Neuladen einer Seite.
Das Neuladen war ja nicht unbedingt das Problem, sondern die regelmäßige und meist erfolglose Datenbankabfrage.
Wobei ich bei der anvisierten Zahl von 100 Stück pro Tag, oder auch bei Abfragen im Minutenabstand, keinerlei Probleme sehen würde. Und wenn es tatsächlich zu einem Problem wird, weil eine Millionen Filialen das benutzen, gibt es immer noch Möglichkeiten, serverseitig einen Cache einzubauen.
Dann allerdings würde ich mir eventuell dann doch mal Gedanken machen, ob es nicht schlauer ist, einen push-fähigen Client mitsamt passendem Protokoll (also nicht HTTP) zu benutzen.
- Sven Rautenberg
Danke für Eure Mühe.
Ich denke, ich werde in einem kleinen Frame regelmäßig eine Abfrage machen lassen und wenn es neue Daten gibt, soll es die ganze Seite aktualisieren. Eine Frage noch: Ist denn das Meta-Reload zuverlässig ? Ich war mal Gast auf einer anderen Seite, da ging es manchmal, manchmal aber auch nicht ?!
Moin!
Das ganze ist natürlich nicht so sparsam wie es mittels eines echten Pushes wäre, schließlich wird doch in regelmäßigen Abständen ein Request abgesetzt, allerdings werden doch sehr viel weniger Informationen übertragen, als bei dem kompletten Neuladen einer Seite.
Das Neuladen war ja nicht unbedingt das Problem, sondern die regelmäßige und meist erfolglose Datenbankabfrage.
Wobei ich bei der anvisierten Zahl von 100 Stück pro Tag, oder auch bei Abfragen im Minutenabstand, keinerlei Probleme sehen würde. Und wenn es tatsächlich zu einem Problem wird, weil eine Millionen Filialen das benutzen, gibt es immer noch Möglichkeiten, serverseitig einen Cache einzubauen.
Dann allerdings würde ich mir eventuell dann doch mal Gedanken machen, ob es nicht schlauer ist, einen push-fähigen Client mitsamt passendem Protokoll (also nicht HTTP) zu benutzen.
- Sven Rautenberg