0

皆さん、こんにちは。

私は自分の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(); しかし、環境間でコードの互換性を高めたいので、実際にはオプションではありません。

4

1 に答える 1