I am having a issue where SSE events wait until the script has finished executing before finally sending the data, after hours of searching for a plausible explanation or solution, I have found nothing.
I have found a example however that works on that website, however taking that code onto my server, it doesn't work. (URL: http://www.binarytides.com/monitor-progress-long-running-php-scripts-html5-server-sent-events/)
In this example I have noticed a header of Transfer-Encoding: chunked
When I had tried to make Apache send this header through .htaccess with Header set
, the response code turned to "(failed)".
I also noticed the example didn't have a Content-Length
, where as the one from my server does.
This was all tested on Chrome v.53.0.2785.116m
After that I decided to take it to the stacks.
Here is a example:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
while ($x < 5) {
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
sleep(1);
$x++;
}
?>
If I were to perform a request to this script, I would get these headers:
HTTP/1.1 200 OK Date: Tue, 27 Sep 2016 22:34:11 GMT Server: Apache Cache-Control: no-cache Vary: Accept-Encoding,User-Agent Content-Encoding: gzip Content-Length: 91 Keep-Alive: timeout=15, max=43 Connection: Keep-Alive Content-Type: text/event-stream
I will not get any data from this until the script had finished executing.
At this point I'm unclear if its Apache, or PHP that is at fault here, but from what I can tell the server is at fault. I've tried version of PHP ranging from 5.5-7, all with no luck.
Any ideas on whats going wrong here and how to fix it?
EDIT 1: I tried the same script on another server and it had worked properly, and sent the following headers:
HTTP/1.1 200 OK Server: nginx Date: Wed, 28 Sep 2016 15:40:00 GMT Content-Type: text/event-stream;charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Keep-Alive: timeout=15 Cache-Control: no-cache ngpass_ngall: 1