Ill start off by saying this works perfectly on my local machine, the js example below connects to stream.php and receives a continuous update of the servers current time every
@Derrick, your suggested ob_end_flush();
line got me close, but in more complex PHP than hello world code, I was still getting unwanted reopens on my SSE connections (I still don't fully understand why ob_end_flush()
was doing that to me). So here's the pattern I'm now using (otherwise identical to your stream.php). In English, I'm turning off PHP output buffering before entering my infinite loop:
// per http://www.php.net/manual/en/book.outcontrol.php:
// Clean (erase) the output buffer and turn off output buffering
ob_end_clean();
// how long PHP script stays running/SSE connection stays open (seconds)
set_time_limit(60);
while (true) {
// use @Derrick's header/send code here
ob_flush(); // note I don't turn off output buffering here again
flush();
sleep(1);
}
just add, ob_flush(); before flush() function in stream.php
updated stream.php script is as below, observe ob_flush() function before flush() function.
while(true)
{
// Headers must be processed line by line.
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// Set data line
print "data: " . date( 'G:H:s', time() ) . PHP_EOL . PHP_EOL;
// Toilet
**ob_flush();**
flush();
// Wait one second.
sleep(1);
}
Server.php needs to be as follows:
while(true)
{
// Headers must be processed line by line.
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
// Set data line
print "Event: server-time" . PHP_EOL;
print "data: " . date( 'G:H:s', time() ) . PHP_EOL;
print PHP_EOL;
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Wait one second.
sleep(1);
}
Sleep is blocking the SSE. I too had the same problem. I was advised to use event driven programming.