10

PHP と while ループを使用してサーバー送信イベント スクリプトを設定しましたが、スクリプトを閉じ続けて再ポーリングする必要がなかったので、すべてを while ループに入れました。

問題は、スクリプトが動かなくなったため、そのルートを放棄しなければならず、代わりに node.js websocket バックエンドを使用したことでした。

私の質問は、サーバー送信イベント php スクリプトの作成に戻った場合、どのように実装すればよいですか?
whileループはスクリプトをハングアップさせるため、それをカットしていないように見えます.1秒ごとに接続および切断するだけであれば、長いポーリングと同じです. SSE メッセージ?

4

1 に答える 1

5

PHP出力のバッファリングに問題があるようです。whileループの最後に次の行を追加してみてください。

ob_flush();
flush();

これにより、出力バッファリングが無効になります。

編集サーバーの負荷を減らすために、しばらくして(つまり、10分)スクリプトを終了することもできます。

私はあなたがそれを非常に簡単に行うためのライブラリを作成しました。こちらで確認してください

2番目の編集 nginxやニスなどのリバースプロキシはありますか?これが理由である可能性があります。プロキシが出力のコンテンツをキャッシュしようとしますが、SSEスクリプトは停止するまで終了しないため、すべてがハングします。出力をキャプチャする他のものは、mod_deflateなどの同様の結果をもたらす可能性があります。

3番目の編集 リバースプロキシを使用している場合は、キャッシュをオフにしてSSEが機能できるようにすることができます。

PHPには、出力バッファリングを無効にする別の方法があります。以下のコードを参照してください。

<?php
for($i=0;$i<ob_get_level();$i++){
    ob_end_flush();
}
@apache_setenv('no-gzip',1);
@ini_set('implict_flush',1);
ob_implict_flush(true);
于 2013-01-02T23:04:41.597 に答える