2016-04-19 34 views
1

現在、Server-Sent Eventsで作業していますが、奇妙な問題が発生しています。イベントが進むように、各イテレーションを経て、私は、次のエラーが発生します:次のようにサーバーのイベントサーバーサイド用Ob_end_flushで一定のエラーが発生しています

ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush in

私のコードは次のとおりです。

<?php 

    require "connect.php"; 

    session_write_close(); 

    header("Content-Type: text/event-stream\n\n"); 

    $savedcount = 0; 
    while (1) { 

    // Who's mechanism 
    $query = $mysqli->query("SOME QUERY"); 
    $rowcount = $query->num_rows; 

    if ($savedcount != $rowcount) { 
     // echo stuff 
     $savedcount = $rowcount; // only echo stuff if there is new content 
    } 

    ob_end_flush(); 
    flush(); 
    sleep(2); 
    } 

?> 

は、私は完全にバッファを理解していません。また、これがひどいことを前提にする前に、Server-Sent Eventsは特別なものであることをご理解ください。これは、MDNに表示される同様のスクリプトです。このような理由から、なぜ私はこれらのエラーを引き続き受けているのか正確にはわかりません。

提案?

+1

バッファの内容を送信する前に、[ob_start()](http://php.net/manual/en/function.ob-start.php)を使用してバッファの内容を開始する必要があります。また、while(1)では、このスクリプトはサーバが最大実行時間に停止するまで実行されます。それはあなたが欲しいものですか? – larsAnders

+0

はい、サーバー送信イベントが正常に動作するためにはこれが必要です – Shawn31313

+0

バッファを起動するには、 'ob_start();' – Rasclatt

答えて

1

私はいつもこのイディオムを使用している:

HTML5 SSEを持つデータプッシュアプ​​リのP.21から引用
@ob_flush();@flush(); 

:(免責事項:私の本を)

@ is said to be slow. But putting that in context, it adds on the order of 0.01ms to call it twice, as shown here. ... http://git.php.net/?p=php-src.git;a=blob;f=sapi/apache2handler/sapi_apache2.c#l290 suggests flush() can never throw an error, so @ on flush() could be dropped, just leaving it on @ob_flush().

http://git.php.net/?p=php-src.git;a=blob;f=main/output.c#l1328ob_flush()を与えることができる2 E_NOTICEsを示しています。

2

PHPでは、出力バッファにはページに印刷される実際の内容が格納されています。したがって、何もエコーしない場合、バッファは空になり、ob_end_flushで何も送信しないとエラーが発生します。あなたはこのエラーを回避するためのチェックを追加することができます。

if (ob_get_length() > 0) { 
    ob_end_flush(); 
    flush(); 
} 

sleep(2); 
関連する問題