<?php
ob_start();
echo 'test';
ob_end_flush();
flush();
sleep(10);
接続が完了する前に Ajax リクエストの応答を出力しようとしましたが、機能しません。応答を正常に取得するまでに 10 秒待機します。これは http サーバー (私の場合は Apache) の問題でしょうか? そうであれば、応答をすぐにエコーバックするように修正するにはどうすればよいでしょうか?
答え1
flush()
、ob_end_flush()
および はob_flush()
出力がサーバーに送信されることを保証することになっていますが、PHP は特定のソフトウェア構成に対してあまり寛容ではない場合があることがわかりました。
特に Windows では、出力バッファリングの設定が面倒な場合があります。システム間で確実に動作する唯一の方法は、次のようにフラッシュごとに出力バッファリングをリセットすることです。
<?php
obf_start();
for($i=0;$i<70;$i++) {
echo 'printing... ', microtime(true), '<br />';
if($i % 3 == 2) obf_flush();
usleep(300000);
}
function obf_start() {
ob_start();
}
function obf_flush() {
ob_end_flush();
ob_flush();
flush();
obf_start();
}
それは醜い解決策でしょうか?はい、そうです。しかし、出力バッファリングに関連するすべてのバグ修正されても、この回避策がすぐに製品版コードからなくなることはないと思います。
また、一部のウイルス対策ソフトウェア (Panda AV など) やプロキシは、ソケットが閉じられるまですべてのデータを保持することに注意してください。すべてのクライアントが適切にフラッシュされたデータを受信することを保証することはできません。
答え2
サーバーの問題か、ブラウザ/ライブラリの問題かを知る最も簡単な方法は、リクエストをライブで監視することです。あなたのケースでは、これを行う最も簡単な方法は 2 つあります。
- ファイアバグ: この Firefox 拡張機能は、送信されたすべての AJAX リクエストをリアルタイムで表示し、ブラウザーで受信されるとすぐに応答を表示します。
- トラフィック キャプチャ: Wireshark などのツールを使用して、送信されるあらゆる種類のリクエストとサーバーから返される TCP トラフィックをリアルタイムで確認します。
データがすぐに返ってくるのに、表示に 10 秒かかる場合、ブラウザまたは AJAX ライブラリは、応答を処理する前に接続が閉じられるのを待っています。何かが返されるまでに 10 秒かかる場合、サーバーまたは PHP モジュールに問題があります。