ホームページ  >  記事  >  バックエンド開発  >  PHPバッファとヘッダ関数の秘密

PHPバッファとヘッダ関数の秘密

WBOY
WBOYオリジナル
2016-06-23 13:02:44789ブラウズ

実際の開発では、ヘッダーの前に実際の出力は存在できないということを聞いたことがありますか?ヘッダー関数はコードの先頭に記述する必要があると考える人さえいます。しかし、ヘッダー関数の前に何かを出力してみましたか?詳しく見てみましょう


  • ヘッダーをテストする前に出力
    <?phpecho 'hello world!';header('content-type: text/html;charset=utf-8;');
    がありました。テストしたところ、エラーや警告は発生せずに成功しました。あなたの状況がどのようなものであるかわかりませんが、「ヘッダー情報を変更できません - ヘッダーはすでに送信されました」のような警告が表示された場合、ヘッダー情報は変更できないことを意味していると思います。送られた。なぜ 2 つの異なる結果があるのか​​を理解しましょう。

バッファ

例えると、映画を視聴するときのキャッシュのようなものです。すぐには再生されませんが、ダウンロードされたムービーの一部がまずキャッシュに入れられ、次にキャッシュから再生されます。これは、PHP コードを記述するときにも当てはまります

php のキャッシュ メカニズム - Output_buffering

  • php でよく使用される ob 関数
function 説明
ob_start 出力バッファを開く
ob_clean バッファをクリアする
ob_g​​et_contents バッファの内容を返す
ob_g​​et_clean バッファの内容を返してクリアする
<?phpob_start();echo 'hello world!';echo ob_get_contents();//输出hello world!hello world!
  • php の .ini 設定ファイルで、バッファ サイズを変更します。 guttually

一般に233行目では、デフォルトは4096です。これは4096バイトが4kb

4096を変更し、このコードを再実行し、今すぐテストの警告またはエラーはありません。エラーは次のように表示されます:
ヘッダー情報を変更できません - ヘッダーはすでに送信されました

ヘッダーとバッファーの間の分析

ヘッダーは以前に出力を持つことができないと前に述べた理由

  • header 関数の場合、それは次のとおりです。クライアントによって送信される元の http ヘッダーは、私たちが書いている Web ページのコンテンツが何であるかを宣言するものであるため、このステートメントの前にコンテンツがあると、それは間違っており、http ルールに準拠しません

    php のヘッダー
  • php では、ヘッダーはバッファーを経由せず、サーバーを介してクライアントに直接出力されます

    前の警告を説明しますヘッダー情報は変更できません
  • 出力を書き込むときヘッダーの前では、最初にバッファーを通過します。したがって、先に書いたとしても、最終的な出力順序はヘッダーが先でエコーが先になります。

    しかし、出力したコンテンツのバッファー領域が収まらなくなると、つまり、以前の出力「hello world!」が 5 バイトを超えてしまいます。これは直接出力されます。つまり、最初に 'hello world' を出力し、次に header(...) を出力します。これは、実際のヘッダーの前に出力できないという事実に違反します

    概要
実際には、または、ページの先頭にヘッダーを書きます。ヘッダーの前の出力コンテンツをバッファーに格納できるかどうかがわからないためです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。