Ik probeer PHP + MySQL te leren zodat ik zowel de frontend and de backend van een site kan maken. Ik ben nu bezig met een soort shoutbox of comment achtige applicatie, de simpele sql queries lukken prima, ajax werkt ook, maar nou lijkt het me ideaal om server sent events te gebruiken om automatisch nieuw geplaatste posts te pushen. Hier gaat ’t mis. Ik krijg ’t enigszins werkend, Maar de browser wordt erg unresponsive. In m’n enigszins werkende shoutbox applicatie gaat ’t mis als ik met meer dan 2 browsers werk, en sowieso duurt ’t een halve minuut voordat ze daadwerkelijk de stream gevonden hebben. Dus om te kijken waar ’t probleem zat heb ik een simpelere test stream en html file gemaakt:
De html file doet geen bijzondere dingen verder, maar hier’s de javascript voor ’t geval dat:
2 dingen:
1] De sleep() functie, zorgt er voor dat de code heel anders behandelt wordt. Als ik ’m eruit sloop, dan reageert ie zoals verwacht, ik krijg een stortvloed aan events, waardoor de browser dus unresponsive raakt. Als ik ’m echter toevoeg, dan lijkt ie unresponsive (en dat is waarom ik ’m er aanvankelijk uitgesloopt heb), maar na verder onderzoek m.b.v de dev tools, blijkt dat er om de 5 minuten (precies) in 1 keer alle events van die afgelopen 5 minuten tevoorschijn komen. ik snap niet hoe de sleep() functie voor dit verschil zorgt, en wat er op de achtergrond precies gebeurt. Zou ik naar PHP’s output buffer functies moeten kijken om dit goed werkend te krijgen? Is ’t iets anders? De verwachting was dat ie simpelweg om de seconde een nieuwe event fired, en dat ik dus in de browser elke seconde een nieuwe tijd te zien krijg, en niet om de 5 minuten.
2] ik zou ook graag willen weten hoe ik ’t beste variables in de stream kan verwerken. Om het shoutbox voorbeeld te nemen: in m’n huidige code kijkt de stream zelf in een externe file wat de laatste post is. Die externe file bevat niks anders dan de id van de laatste post. Maar omdat die stream dus niet echt werkt zoals verwacht met de sleep() functie, gebruik ik ’m zonder, maar dan wordt die file dus constant geopend, wat er (volgens mij) dus voor zorgt dat dit niet werkt met meer dan 2 connecties. Iemand een suggestie hoe ik de stream het beste op de hoogte kan brengen van b.v. nieuwe posts?
Als ik google, kan ik niet erg veel vinden op dit gebied wat dieper in gaat op de server-side kant van het verhaal, dus geen idee wat ik fout doe, of hoe ’t hoort. Als iemand mij op mijn fouten kan wijzen dan graag.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <?php header("Content-Type: text/event-stream"); header("Cache-Control: no-cache"); $x = 0; while (true) { sleep(1); echo "id: {$x}" . PHP_EOL; echo "data: " . date("H:i:s") . PHP_EOL; echo PHP_EOL; $x++; flush(); } ?> |
De html file doet geen bijzondere dingen verder, maar hier’s de javascript voor ’t geval dat:
JavaScript:
1
2
3
4
5
6
7
8
| var source = new EventSource("test_stream.php"); source.onmessage = function(event) { console.log(event.data); // debug document.getElementById("stream").innerHTML = event.data; }; |
2 dingen:
1] De sleep() functie, zorgt er voor dat de code heel anders behandelt wordt. Als ik ’m eruit sloop, dan reageert ie zoals verwacht, ik krijg een stortvloed aan events, waardoor de browser dus unresponsive raakt. Als ik ’m echter toevoeg, dan lijkt ie unresponsive (en dat is waarom ik ’m er aanvankelijk uitgesloopt heb), maar na verder onderzoek m.b.v de dev tools, blijkt dat er om de 5 minuten (precies) in 1 keer alle events van die afgelopen 5 minuten tevoorschijn komen. ik snap niet hoe de sleep() functie voor dit verschil zorgt, en wat er op de achtergrond precies gebeurt. Zou ik naar PHP’s output buffer functies moeten kijken om dit goed werkend te krijgen? Is ’t iets anders? De verwachting was dat ie simpelweg om de seconde een nieuwe event fired, en dat ik dus in de browser elke seconde een nieuwe tijd te zien krijg, en niet om de 5 minuten.
2] ik zou ook graag willen weten hoe ik ’t beste variables in de stream kan verwerken. Om het shoutbox voorbeeld te nemen: in m’n huidige code kijkt de stream zelf in een externe file wat de laatste post is. Die externe file bevat niks anders dan de id van de laatste post. Maar omdat die stream dus niet echt werkt zoals verwacht met de sleep() functie, gebruik ik ’m zonder, maar dan wordt die file dus constant geopend, wat er (volgens mij) dus voor zorgt dat dit niet werkt met meer dan 2 connecties. Iemand een suggestie hoe ik de stream het beste op de hoogte kan brengen van b.v. nieuwe posts?
Als ik google, kan ik niet erg veel vinden op dit gebied wat dieper in gaat op de server-side kant van het verhaal, dus geen idee wat ik fout doe, of hoe ’t hoort. Als iemand mij op mijn fouten kan wijzen dan graag.
Make lovecraft not warcraft.