10

これが私のローカルマシンで完全に機能することから始めましょう。以下の js の例は、stream.php に接続し、サーバーの現在時刻の継続的な更新を毎秒受信します。

index.php

var source = new EventSource("stream.php");

source.addEventListener('message', function(e) {
    console.log(e);
}, false);

source.addEventListener('open', function(e) {
    console.log(e);
}, false);

source.addEventListener('error', function(e) {
    if (e.readyState == EventSource.CLOSED) {
        console.log('closed');
    }
}, false);

ストリーム.php

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
    flush();

    // Wait one second.
    sleep(1);
}

ライブ開発にアップロードした後、少し遅れることが予想されました。サーバ。ただし、約 15 ~ 20 分の遅延があります。最初のエントリを見る前に。

接続はドロップしません。(おそらく 40 分以上かかりました。現在。) これは単なる Apache ループの問題ですか (つまり、Web ソケットを調べる時間です)、それともこれを修正するために私にできることはありますか?

4

4 に答える 4

10

Server.php は次のようにする必要があります。

ストリーム.php

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);
}
于 2012-09-06T14:05:25.723 に答える
2

スリープが SSE をブロックしています。私も同じ問題を抱えていました。イベント駆動型プログラミングを使用するように勧められました。

于 2014-02-19T18:33:42.640 に答える
2

@Derrick、提案されob_end_flush();た行は私を近づけましたが、Hello World コードよりも複雑な PHP では、SSE 接続で不要な再オープンが発生していました (なぜそれが私に行われたのか、まだ完全には理解できob_end_flush()ません)。これが私が現在使用しているパターンです (それ以外は、stream.php と同じです)。英語では、無限ループに入る前に PHP 出力バッファリングをオフにしています。

// 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);
}
于 2012-09-13T17:52:49.303 に答える
0

ob_flush(); を追加するだけです。stream.php の flush() 関数の前

更新された stream.php スクリプトは以下のとおりです。flush() 関数の前に ob_flush() 関数を観察してください。

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);
}
于 2014-06-26T08:25:46.820 に答える