SSE Event senden von extern

  • Heyho Community,


    ich weiß nicht, ob ich einfach nur falsch denke oder etwas vergesse.


    Folgendes Problem:

    Ich habe eine event.php, welche ich als URL für die EventSource verwende.

    Jetzt möchte ich per POST-Request, einen "Prozess" auslösen, welcher Events an die event.php "senden" soll, damit sie am Ende beim EventSource auftreten.


    Ums besser verständlich zu machen:

    JavaScript


    Den PHP Code Teil hab ich jetzt mal weg gelassen, da ich mir nicht sicher bin ich man es umsetzen kann.

  • Hallo monster010,


    darf ich fragen, warum Du da machen möchtest ?


    SSE ist heutzutage eine schlechte Idee. Es braucht zu viele Ressourcen, und Websockets werden inzwischen von jedem relevanten Browser unterstützt: https://caniuse.com/websockets


    Außerdem ist PHP, sagen wir mal, nicht die beste Wahl für SSE.


    Es gibt 2 Möglichkeiten


    1) Dein event.php Script muss dazu in einer Schleife ewig loopen (z.B. mit while(true))

    Jetzt musst Du innerhalb der Schleife regelmäßig checken, ob sich etwas geändert hat, z.B. in Redis, Mysql, Filesytem

    Ein sehr einfaches Beispiel könnte jede Sekunde (sleep) checken, ob ein bestimmtest File existiert, und wenn ja, den Inhalt senden, und es dann löschen.

    In Deiner ajax.php schreibst Du dann dieses File.


    2) Du benötigst eine PHP Erweiterung die dem PHP script eine Möglichkeit bietet sich an ein Event zu binden.

    z.B. Redis (sub/pub), dann kannst Du jedesmal, wenn Redis Dir einen Event sendet, ihn an Den Browser senden.

    Dein ajax.php muss dann diesen Event an Redis senden.


    Wie schon gesagt, nimm lieber Websockets und z.B. node.js, Java, .net Core oder vergleichbares.

    Der Restliche (nicht Websocket-Teil) kann ja trotzdem PHP sein, wenn Dir das lieber ist

  • Es gibt auch gut funktionierende Möglichkeiten über SSE als Alternative zu WebSockets, wenn PHP verwendet wird braucht man dafür allerdings einen zusätzlichen, permanent laufenden, Prozess (damit würde das z.B. nicht auf einem netcup Webhosting laufen). Siehe z.B. https://github.com/dunglas/mercure

    Man sendet dann über einen POST-Request vom PHP-Skript aus die Nachricht an diesen Server und der schickt es an alle verbundenen Clients weiter.

  • Andi22 Ich weiß, dass es Websockets gibt. Das Problem ist nur, dass ich auf etwas basiere das in PHP geschrieben ist und es das ganze in keine anderen Sprache gibt. Ergo sind Websockets mit schon raus.


    Werde vermutlich die 1 umsetzen.


    Es gibt auch gut funktionierende Möglichkeiten über SSE als Alternative zu WebSockets, wenn PHP verwendet wird braucht man dafür allerdings einen zusätzlichen, permanent laufenden, Prozess (damit würde das z.B. nicht auf einem netcup Webhosting laufen). Siehe z.B. https://github.com/dunglas/mercure

    Man sendet dann über einen POST-Request vom PHP-Skript aus die Nachricht an diesen Server und der schickt es an alle verbundenen Clients weiter.

    Ringelnatz Das Problem an deinem Vorschlag ist der permanent laufende Prozess.

  • monster010 Ich wäre dann interessiert an Erfahrungsberichten ob's geklappt hat. Ich kann mir nämlich nicht vorstellen, dass eine daemon-lose Lösung wirklich funktioniert. Auch bei der genannten Lösung mit der Endlosschleife wird der Prozess ja je nach Umgebung in Timeouts laufen.

  • Vielleicht könnte man einen Cronjob benutzen anstatt der Endlosschleife. Ist natürlich nur eine Idee. Muss ja möglicherweise auch nicht unbedingt sekündlich sein. Fals einmal pro Minute reicht. Ansonsten könnte man natürlich auch minütlich einen Prozess starten, der etwas weniger als eine Minute lang den Check übernimmt. Die Details würden freilich noch einiges an Ausarbeitung benötigen.

  • Habe sowas in der Art Mal vor zig Jahren umgesetzt, es funktioniert schon.

    Die Schleife darf nicht endlos sein sondern muss bevor es zu einem timeout kommt etwas zurück schicken.

    Der Client testet anschließend ob es sich um etwas vernünftiges handelt dann verarbeitet er es wenn nicht nicht.

    Und im Client läuft die endlos Schleife.

    Also egal ob ein Event oder nur der Null Wert kommt anschließend wird direkt die selbe Anfrage erneut gesendet.

    Ich habe es damals so gelöst dass ich immer den timestamp oder nen counter an das Backend geschickt habe und dort geprüft habe ob es ein neues Event gibt