ヘッダーがバッファリングされ、ブラウザに送信されないようにするためにob_start()
使用されますか? output buffering
私はここで理にかなっていますか?そうでない場合、なぜ使用する必要があるのob_start()
でしょうか?
9 に答える
ob_start()
「通常は出力されるものをすべて覚え始めますが、まだ何もしないでください」と考えてください。
例えば:
ob_start();
echo("Hello there!"); //would normally get printed to the screen/output to browser
$output = ob_get_contents();
ob_end_clean();
通常ペアリングする他の2つの関数がありますob_get_contents()
。基本的に、バッファがオンになってからバッファに「保存」されたものをすべて提供しob_start()
、次にob_end_clean()
またはob_flush()
、保存を停止して保存されたものを破棄するか、保存を停止します。それぞれ一度に出力します。
私はこれを使用して、多くの HTML で PHP から抜け出すことができますが、レンダリングはしません。IDEの色分けを無効にする文字列として保存する必要がありません。
<?php
ob_start();
?>
<div>
<span>text</span>
<a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>
それ以外の:
<?php
$content = '<div>
<span>text</span>
<a href="#">link</a>
</div>';
?>
ここで受け入れられた回答ob_start()
は、それが使用される理由ではなく、何が行われるかを説明しています(これは尋ねられた質問でした)。
他の場所で述べたようob_start()
に、出力が書き込まれるバッファを作成します。
しかし、PHP 内で複数のバッファーをスタックできるとは誰も言及していません。ob_get_level ()を参照してください。
なぜかというと……。
HTML を大きなチャンクでブラウザに送信すると、ネットワーク オーバーヘッドが減少するため、パフォーマンスが向上します。
PHP から大きなチャンクでデータを渡すと、必要なコンテキスト スイッチの数が減り、パフォーマンスと容量が向上します。
より大きなデータのチャンクを mod_gzip/mod_deflate に渡すと、圧縮がより効率的になり、パフォーマンスが向上します。
出力をバッファリングするということは、コードの後半で HTTP ヘッダーを操作できることを意味します。
[head]....[/head] を出力した後にバッファを明示的にフラッシュすると、ブラウザは HTML ストリームが完了する前にページの他のリソースのマーシャリングを開始できます。
出力をバッファにキャプチャするということは、電子メールなどの他の機能にリダイレクトしたり、コンテンツのキャッシュされた表現としてファイルにコピーしたりできることを意味します。
あなたはそれを後方に持っています。ob_startはヘッダーをバッファリングせず、コンテンツをバッファリングします。を使用ob_start
すると、コンテンツを表示する準備ができるまで、コンテンツをサーバー側のバッファーに保持できます。
これは一般的に、ページが「送信済み」の後にヘッダーを送信できるようにするために使用されます(つまり、ページのレンダリングの途中でリダイレクトすることを決定します)。
私が好む:
ob_start();
echo("Hello there!");
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer
この関数はヘッダーだけのものではありません。これで面白いことがたくさんできます。例: ページをセクションに分割して、次のように使用できます。
$someTemplate->selectSection('header');
echo 'This is the header.';
$someTemplate->selectSection('content');
echo 'This is some content.';
ここで生成された出力をキャプチャして、レイアウト内のまったく異なる 2 つの場所に追加できます。
次のことは、既存の回答には記載されていません: バッファ サイズの構成 HTTP ヘッダーとネスティング。
ob_start のバッファサイズ構成:
ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.
上記のコードは、PHP が 4KB などのより大きなデータのチャンクを送信するため、サーバーのパフォーマンスを向上させます (ob_start を呼び出さないと、php は各エコーをブラウザーに送信します)。
チャンク サイズなしでバッファリングを開始すると (つまり、単純な ob_start())、スクリプトの最後でページが 1 回送信されます。
出力バッファリングは HTTP ヘッダーには影響しません。それらは異なる方法で処理されます。ただし、バッファリングにより、出力が送信された後でもヘッダーを送信できます。これは、ヘッダーがまだバッファーにあるためです。
ob_start(); // turns on output buffering
$foo->bar(); // all output goes only to buffer
ob_clean(); // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents(); // buffer content is now an empty string
ob_end_clean(); // turn off output buffering
ここでうまく説明されています:https://phpfashion.com/everything-about-output-buffering-in-php
いいえ、あなたは間違っていますが、方向は合っています;)
Output-Bufferingは、スクリプトの出力をバッファリングします。それは(要するに)echo
またはの後のすべてprint
です。ヘッダーの特徴は、まだ送信されていない場合にのみ送信できるということです。しかし、HTTPによると、ヘッダーは最初の送信です。したがって、(リクエストで)初めて何かを出力すると、ヘッダーが送信され、他のヘッダーを設定することはできません。