3

このコード:

ob_start();
ob_end_flush();

header('foo');

警告をスローします

Warning: Cannot modify header information - headers already sent

これの間:

echo '';
header('foo');

しません。

それらの間に大きな違いは見られません。

では、この動作は予期されたものですか?

PS: PHP 5.3.2

4

1 に答える 1

3

これに対する私の最初の反応は、「これは私が期待する動作です」でしたが、使用している PHP のバージョンに依存するいくつかの微妙な点があることがわかりました

最初に、( 5.3 を使用していると仮定して) テストに適用されるため、私の最初の反応が何であったかを説明しましょう。

ob_end_flush()暗黙的に を呼び出しflush()、コンテンツが生成されているかどうかに関係なく、ヘッダーをブラウザーにプッシュします。
echo '';一方、基本的にはNOOPです。エンジンに何もしないように要求したため、何も起こりません。

ただし、もう少し調査すると、OBのimplicit_flushオプションは実際にはデフォルトでオフになっていることが示されているため、オプションを明示的に有効にしない限り、実際には違いはありません。

さらに、この動作は5.2.2 より前または 5.4.0 以降では見られないため、次の訪問先はこれこれを比較することでした。C をまったく読めなくても、5.3 と 5.4 の出力処理に大きな違いがあることは明らかです。かなり大幅な書き直しが行われています。

現実のコミットメントのために、私はまだそれを適切に引き離して、この特定の問題に関連するキーコードを見つけていませんが、すぐにそうし、そうしたらこの回答を拡張します.


概要:

  • PHP のバージョンと構成によっては、これはおそらく論理的で予期される動作である可能性があります。
  • PHP のバージョンが大きく異なるため、この質問には単純な答えが 1 つだけではありません。
于 2013-05-01T08:45:54.973 に答える