<code> public static function pushEvent(){ header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); // 建议不要缓存SSE数据 header('Connection: keep-alive'); //header('X-Accel-Buffering: no');//有可能用nginx的需要设置这个才能把缓冲数据刷出去 $serverTime = time(); $hasData = hFile::cache('pushEvent');//读缓存 if($hasData){ hFile::cache('pushEvent',0);//存缓存 self::sendMsg($serverTime, 'server time: ' . date("h:i:s"),'myevent',100000); }else self::sendMsg('','','',100);//多少毫秒内无数据,再重连 } /** * @param string $id Timestamp/id of this connection. * @param string $msg Line of text that should be transmitted. * @param $event string */ private static function sendMsg($id='', $msg='',$event='',$retry=''){ if(!($id||$event||$msg||$retry)) return; if($retry) echo "retry: $retry" .PHP_EOL; if($id) echo "id: $id" . PHP_EOL; if($event) echo "event: {$event}" . PHP_EOL; if($msg) echo "data: $msg" . PHP_EOL; echo PHP_EOL;//表示本条数据结束 ob_flush(); flush(); } </code>
我是上面這樣寫的,(部分程式碼是抄來的)。問題是,前端每建立一次連接,php只能回傳一次數據,如果想要下次的數據,是靠這行self::sendMsg('','','',100);//多少毫秒內無數據,再重連
,這行會讓前端多少毫秒後再重新建立連接,這樣覺得會非常浪費資源,而且每次要輸出數據前是讀取緩存是否有發給該用戶的消息這種方式,還有沒有別的好方式?
<code> public static function pushEvent(){ header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); // 建议不要缓存SSE数据 header('Connection: keep-alive'); //header('X-Accel-Buffering: no');//有可能用nginx的需要设置这个才能把缓冲数据刷出去 $serverTime = time(); $hasData = hFile::cache('pushEvent');//读缓存 if($hasData){ hFile::cache('pushEvent',0);//存缓存 self::sendMsg($serverTime, 'server time: ' . date("h:i:s"),'myevent',100000); }else self::sendMsg('','','',100);//多少毫秒内无数据,再重连 } /** * @param string $id Timestamp/id of this connection. * @param string $msg Line of text that should be transmitted. * @param $event string */ private static function sendMsg($id='', $msg='',$event='',$retry=''){ if(!($id||$event||$msg||$retry)) return; if($retry) echo "retry: $retry" .PHP_EOL; if($id) echo "id: $id" . PHP_EOL; if($event) echo "event: {$event}" . PHP_EOL; if($msg) echo "data: $msg" . PHP_EOL; echo PHP_EOL;//表示本条数据结束 ob_flush(); flush(); } </code>
我是上面這樣寫的,(部分程式碼是抄來的)。問題是,前端每建立一次連接,php只能回傳一次數據,如果想要下次的數據,是靠這行self::sendMsg('','','',100);//多少毫秒內無數據,再重連
,這行會讓前端多少毫秒後再重新建立連接,這樣覺得會非常浪費資源,而且每次要輸出數據前是讀取緩存是否有發給該用戶的消息這種方式,還有沒有別的好方式?
請參考我的這篇文章: https://segmentfault.com/a/11...
最關鍵的是下面這段:
<code>ob_flush(); flush(); //等待3秒钟,开始下一次查询 sleep(3); </code>
flush之後,不要斷開連接,而是睡眠3秒後再次進入循環,這樣就可以保持住連接,不會斷開重連。
為什麼不透過websocket去做這樣的事呢?