I have a php script that imports big data from csv files with validations.
To do this, I need to show the progress to the user. For this, I used Event Streaming.
When I repeat something, I want it to be transmitted to the client one by one, and the server sent all the output in bulk.
I already played with ob_start (), ob_implicit_flush () and ob_flush (), but they did not work.
My script is working fine on another server. The following are server configurations:
Server configuration on which the code does not respond as desired, i.e.
OS: Linux
PHP Version 5.4.36-0 + deb7u3
Server API: CGI / FastCGI
Memory_limit: 128M
output_buffering: no value
As I said, the code works correctly on another server that has almost the same configuration, i.e.
OS: Linux
PHP Version 5.4.37
Server API: CGI / FastCGI
Memory_limit: 256MB
output_buffering: no value
The following is sample code for sending an event:
<?php header("Content-Type: text/event-stream"); header("Cache-Control: no-cache"); header("Access-Control-Allow-Origin: *"); $lastEventId = floatval(isset($_SERVER["HTTP_LAST_EVENT_ID"]) ? $_SERVER["HTTP_LAST_EVENT_ID"] : 0); if ($lastEventId == 0) { $lastEventId = floatval(isset($_GET["lastEventId"]) ? $_GET["lastEventId"] : 0); } echo ":" . str_repeat(" ", 2048) . "\n"; // 2 kB padding for IE echo "retry: 2000\n"; // event-stream $i = $lastEventId; while ($i <= 100) { if($i==100){ echo "data: stop\n"; ob_flush(); flush(); break; } else { echo "id: " . $i . "\n"; echo "data: " . $i . ";\n\n"; ob_flush(); flush(); sleep(1); } $i++; } ?>
Below is my client page where I need an answer:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>EventSource example</title> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <script src="../jquery/eventsource.js"></script> <script> var es = new EventSource("events.php"); var listener = function(event) { console.log(event.data); var type = event.type; if (event.data == 'stop') { es.close(); } else { var div = document.createElement("div"); div.appendChild(document.createTextNode(type + ": " + (type === "message" ? event.data : es.url))); document.body.appendChild(div); } }; var errlistener = function(event) { es.close(); } es.addEventListener("open", listener); es.addEventListener("message", listener); es.addEventListener("error", errlistener); </script> </head> <body> </body> </html>
javascript linux html5 php event-stream
ba1ar
source share