首頁  >  文章  >  後端開發  >  javascript - h5有個Server-sent Events,php端該怎麼寫?

javascript - h5有個Server-sent Events,php端該怎麼寫?

WBOY
WBOY原創
2016-08-10 09:07:251051瀏覽

<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去做這樣的事呢?

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn