皆さん、こんにちは。
私は自分のphpフレームワークに取り組んでいます。これは、php のヘッダー、クッキー、およびバッファー機能をラッパーする応答マネージャーを備えています。これを使用して、結果ページをユーザーに送信します。
ただし、ob_start -> ob_end_flush -> flush を使用してページ ヘッダーとコンテンツが既に送信されていても、ブラウザは依然としてハングし、スクリプトが完了するのを待ちます。
現在のユーザーのセッションを更新したり、メールを送信したり、何かをアップロードしたりするなど、遅い仕事をしたいときに問題が発生します。ヘッダーを含むページ全体が既にある場合でも、ユーザーはすべてが完了するまで待つ必要があります。
私が知りたいのは、ページが完全に読み込まれたことをブラウザに知らせる方法で、今すぐページを表示できるようにすることです。
ありがとうございました!
/////////////////////////// 放棄されたソリューション //////////////////// ////////
放棄されたソリューション 1
過去に、私は通常、ob_start -> ob_end_flush -> ob_flush -> flush の組み合わせを使用してこの問題を修正しました。次のようになります。
function send($content) {
ob_start();
echo $content;
ob_end_flush();
ob_flush();
flush();
return true;
}
しかし、ob_flush は「フラッシュするバッファがありません」という E_NOTICE をスローします。この E_NOTICE をミュートするだけでこれを修正したくありません (実際、私のフレームワークでは、エラーをミュートする方法はありません)。したがって、これはこの問題を解決する方法ではありません。
放棄されたソリューション 2
また、コンテンツが送信された後に接続を閉じようとします。コードは次のようになります。
function send($content) {
ob_start();
header('Connection: close');
echo $content;
ob_end_flush();
flush();
return true;
}
エラーなしで問題を解決できますが、別の問題が発生します。ページを受信した後にクライアントの接続が閉じられ、別のページを開くには再接続する必要があるようです。これにより、ネットワークに余分な負荷が発生します。
放棄されたソリューション 3
ええ、何人かの人が私に fastcgi を使うように勧めてくれました。そして fastcgi_finish_request(); しかし、環境間でコードの互換性を高めたいので、実際にはオプションではありません。