Heim  >  Artikel  >  Backend-Entwicklung  >  javascript - H5 verfügt über vom Server gesendete Ereignisse. Wie schreibe ich diese auf der PHP-Seite?

javascript - H5 verfügt über vom Server gesendete Ereignisse. Wie schreibe ich diese auf der PHP-Seite?

WBOY
WBOYOriginal
2016-08-10 09:07:251098Durchsuche

<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>

Ich habe es so geschrieben (ein Teil des Codes wurde kopiert). Das Problem ist, dass PHP jedes Mal, wenn das Frontend eine Verbindung aufbaut, nur einmal Daten zurückgeben kann. Wenn Sie die nächsten Daten benötigen, verlassen Sie sich auf diese Zeile self::sendMsg('','','',100);//多少毫秒内无数据,再重连. Diese Zeile teilt dem Frontend mit, wie viele Millisekunden es dauern wird, bis re -Das Herstellen der Verbindung ist eine große Ressourcenverschwendung und jedes Mal wird der Cache gelesen, um zu sehen, ob eine Nachricht an den Benutzer gesendet wird.

Antwortinhalt:

<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>

Ich habe es so geschrieben (ein Teil des Codes wurde kopiert). Das Problem ist, dass PHP jedes Mal, wenn das Frontend eine Verbindung aufbaut, nur einmal Daten zurückgeben kann. Wenn Sie die nächsten Daten benötigen, verlassen Sie sich auf diese Zeile self::sendMsg('','','',100);//多少毫秒内无数据,再重连. Diese Zeile teilt dem Frontend mit, wie viele Millisekunden es dauern wird, bis re -Das Herstellen der Verbindung ist eine große Ressourcenverschwendung und jedes Mal wird der Cache gelesen, um zu sehen, ob eine Nachricht an den Benutzer gesendet wird.

Bitte lesen Sie diesen Artikel von mir: https://segmentfault.com/a/11...

Das Wichtigste ist der folgende Absatz:

<code>ob_flush();
flush();
//等待3秒钟,开始下一次查询
sleep(3);
</code>

Nach dem Spülen nicht trennen, sondern 3 Sekunden schlafen und dann erneut in die Schleife eintreten, damit die Verbindung aufrechterhalten werden kann und die Verbindung nicht getrennt und wieder hergestellt wird.

Warum macht man so etwas nicht über einen Websocket?

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn