Hello I have a javascript code that listens to a PHP code via Server-Sent Events, it is working well the response is sent from the server trough a loop and when the loop ends the Server-Sent Events stops however a few seconds after the script is again listening. how can I end the Server-Sent Events when the loop from the server side ends too? Thanks.
JS :
var sse=new EventSource("data.php");
sse.onmessage=function(event){
document.getElementById("map").innerHTML+=event.data;
};
PHP:
<?php
header('Content-Type: text/event-stream'); //indicates that server is aware of server sent events
header('Cache-Control: no-cache');//disable caching of response
$coordinates = [
[
"20:11",
33.5731235,
-7.6433045
],
[
"20:11",
33.5731054,
-7.6432876
],
[
"20:11",
33.5731644,
-7.6433304
]
];
foreach($coordinates as $c){
echo "data: ".json_encode($c)."\n\n";
ob_get_flush();
flush();
sleep(1);
}
Cancel an event stream # close(); To cancel a stream from the server, respond with a non text/event-stream Content-Type or return an HTTP status other than 200 OK (e.g. 404 Not Found ). Both methods will prevent the browser from re-establishing the connection.
The close() method of the EventSource interface closes the connection, if one is made, and sets the EventSource. readyState attribute to 2 (closed). Note: If the connection is already closed, the method does nothing.
So what are Server-Sent Events? A client subscribes to a “stream” from a server and the server will send messages (“event-stream”) to the client until the server or the client closes the stream. It is up to the server to decide when and what to send the client, for instance, as soon as data changes.
You could use a boolean variable isOpenOnce = false
in your javascript and then in your sse.onopen set isOpen
to true
the first time. In the beginning check the flag and close connection if true. This way no need of server side changes.
var isOpenOnce = false;
sse.onopen = function() {
if(isOpenOnce) {
sse.close();
}else {
console.log("Connection to server opened.");
isOpenOnce = true;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With