. * */ /** * wrapper for server side events (http://en.wikipedia.org/wiki/Server-sent_events) * includes a fallback for older browsers and IE * * use server side events with causion, to many open requests can hang the server */ class OC_EventSource{ private $fallback; private $fallBackId=0; public function __construct(){ header('Cache-Control: no-cache'); $this->fallback=isset($_GET['fallback']) and $_GET['fallback']=='true'; if($this->fallback){ $fallBackId=$_GET['fallback_id']; header("Content-Type: text/html"); echo str_repeat(''.PHP_EOL,10); //dummy data to keep IE happy }else{ header("Content-Type: text/event-stream"); } flush(); } /** * send a message to the client * @param string type * @param object data * * if only one paramater is given, a typeless message will be send with that paramater as data */ public function send($type,$data=null){ if(is_null($data)){ $data=$type; $type=null; } if($this->fallback){ $response=''.PHP_EOL; echo $response; }else{ if($type){ echo 'event: '.$type.PHP_EOL; } echo 'data: '.json_encode($data).PHP_EOL; } echo PHP_EOL; flush(); } /** * close the connection of the even source */ public function close(){ $this->send('__internal__','close');//server side closing can be an issue, let the client do it } }