3

私はphpスクリプトを書いていますが、header()関数の前のどこかでテキストをブラウザに出力しました。これにより、header()関数でよく知られているエラーが発生します。

警告: ヘッダー情報を変更できません - ヘッダーは既に送信されています。

今私の質問は、関数ob_start()ob_flush()前後に使用する意図があるということです。header()しかし、出力バッファのようなものがアプリケーションのパフォーマンスに悪影響を及ぼす可能性があると聞いたことがあります。それはどのくらい本当ですか?

または、ページをリダイレクトするために Javascript 関数を印刷するという考えに固執する必要があります。

御時間ありがとうございます。

4

4 に答える 4

5

約 97% の確率で、わずかな効率性を忘れる必要があります。時期尚早の最適化は諸悪の根源です。

パフォーマンスの違いが重要かどうかをテストob_startして友達と確認してください。その場合は、代替手段を探してください。

最も簡単なオプションはheader()、印刷の前に通話を移動することです。

次のようなリダイレクトを実行している可能性があります。

header('Location: /new/location/');

header()クライアントは印刷したデータに対して何もしないため、この呼び出しの前に何も印刷しないでください (HTTP に欠けているものがない限り)。

meta(何らかの理由で Javascript を検出したい場合を除き、Javascript はリダイレクトに適したオプションではありません。また、リフレッシュすることもできません。)

于 2009-02-08T20:56:52.433 に答える
4

出力バッファを使用するには、サーバーが PHP の出力全体を RAM に格納する必要があるため、大きなページの場合、かなりの量のメモリを使用することになります。また、サーバーは、ページ全体が処理されるまで待機する必要があります。送信前に生成されるため、わずかな遅延が発生する可能性があります。しかし、それ以外には、出力バッファを使用することに大きな欠点はないと思います。あなたがやりたいことについては、それは確かに合理的な解決策です。

于 2009-02-08T20:57:40.417 に答える
2

出力後に PHP コードで再配置すると、アプリケーションの設計が悪いと言えます。しかし、私はあなたの状況を知りません.2つの可能な方法を提案できます.

  1. コードをモデル (データ処理) とビュー (出力) に分割します ( MVCを参照)。これは、何かを表示する前であっても、再配置について決定していることを意味します。私はこの方法を優先と呼んでいました。
  2. 本当に出力 (または送信された他のヘッダー) を表示する必要がある場合、一般的な方法は JS と HTML を (noscript で) 組み合わせることです。

    if (headers_sent()) {
        print('<script type="text/javascript">( document.location.replace ) ? document.location.replace("'.$location.'") : document.location.href = "'.$location.'";</script>'."\n".'<noscript><meta http-equiv="Refresh" content="0;URL='.$location.'" /></noscript>');
    } else {
        header('Location: '.$location);
        exit;
    }
    

PS このコードは Fusebox フレームワークの一部です。

于 2009-02-08T21:19:47.027 に答える
0

最後の発言に答えるだけです:phpでページをリダイレクトできます。header('Location: '.$url)それを使用して、他の出力の前に移動する必要があります。exit();

于 2009-02-08T20:59:20.727 に答える