molily: Websocket grunsätzlich - Variante mit PHP + Variante mit ZF2

Beitrag lesen

Hallo,

Im Script (server.php und auch clientseite) wird noch notiert: "ws://localhost:9000/daemon.php".

Dieses "daemon.php" ist aber kein Script, das existiert, wie ich das sehe. "Was" ist das?

Eine beliebige URL auf die der Daemon reagiert. Ob das auf ein PHP-Script auflöst, ist egal, da hier ein kompletter HTTP-/Websocket-Server in PHP implementiert wird.

Wenn ich mir den Code so ansehe, ist es völlig egal, was in der URL steht, sie wird gar nicht gelesen. Sobald ein Socket geöffnet wird, wird der Handshake gesendet. /husseldiguggeldidu würde vermutlich genauso funktionieren.

  1. Wie stoppe ich das Script, dass ich ja über die Konsole aufrufen muss

Indem du ein SIGINT-Signal an den Prozess sendest. Z.B. indem du Ctrl + C auf dem Terminal drückst.

Ab welcher Fülle von Anfragen verschluckt sich dann aber das Ding?

Das hängt von verschiedenen Parametern ab und lässt sich so grob nicht sagen. Im Zweifelsfall: Benchmarken.

Allgemein sieht diese Implementierung sehr trivial aus. Da gibt es sicher komplexere und robustere Implementierungen. (Ob in PHP weiß ich nicht.)

Abgesehen davon beschäftigt mich noch: mal angenommen, es soll kein Chat damit realisiert werden, sondern zB. ein GPS-Tracker, wo der Client alle 10 Sekunden (oder auch jede Sekunde) seine Position an den Server übermittelt. Wäre da ein Socket überhaupt sinnvoll?

Ja, klar. Der Overhead bei HTTP ist riesig, bei Websockets (nach dem Handshake) gering.

Ansonsten finde ich noch eine Variante, die auf dem ZendFramework basiert als Modul: http://modules.zendframework.com/stanislav-web/ZF2-PHP-WebSocket-Server. Hier starte ich den Server mit "php -q index.php websocket open" was nahelegt, dass ich mit dem Paramter "close" das Ding wieder schließen könnte.

Ein Blick in den Code sagt: Nein.
https://github.com/stanislav-web/ZF2-PHP-WebSocket-Server/blob/master/Module.php
https://github.com/stanislav-web/ZF2-PHP-WebSocket-Server/blob/master/src/WebSockets/Controller/WebsocketCLIController.php

Der Server-Code sieht übrigens genauso aus wie aus dem einfachen Beispiel. Es gibt anscheinend keine Möglichkeit, den »sauber« herunterzufahren, nur den PHP-Prozess mit SIGINT zu schließen.

Da ist mir (immer noch) nicht ganz klar, ob und wenn ja wie das entsprechende Modul dann eingebunden wird, aber da wird die Doku vom ZF vermutlich noch weiter helfen.

Das ist wohl eine Zend-Framework-Frage, davon habe ich keine Ahnung. Aber es wird ja einen Grund haben, dass du die ZF-Variante gewählt hast? Also müsste dir grob klar sein, wie du es integrieren willst.

Mathias