334

ヘッダーがバッファリングされ、ブラウザに送信されないようにするためにob_start()使用されますか? output buffering私はここで理にかなっていますか?そうでない場合、なぜ使用する必要があるのob_start()でしょうか?

4

9 に答える 9

536

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()、保存を停止して保存されたものを破棄するか、保存を停止します。それぞれ一度に出力します。

于 2010-12-09T18:57:51.410 に答える
184

私はこれを使用して、多くの 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>';
?>
于 2010-12-09T19:03:45.463 に答える
100

ここで受け入れられた回答ob_start()は、それが使用される理由ではなく、何が行われるかを説明しています(これは尋ねられた質問でした)。

他の場所で述べたようob_start()に、出力が書き込まれるバッファを作成します。

しかし、PHP 内で複数のバッファーをスタックできるとは誰も言及していません。ob_get_level ()を参照してください。

なぜかというと……。

  1. HTML を大きなチャンクでブラウザに送信すると、ネットワーク オーバーヘッドが減少するため、パフォーマンスが向上します。

  2. PHP から大きなチャンクでデータを渡すと、必要なコンテキスト スイッチの数が減り、パフォーマンスと容量が向上します。

  3. より大きなデータのチャンクを mod_gzip/mod_deflate に渡すと、圧縮がより効率的になり、パフォーマンスが向上します。

  4. 出力をバッファリングするということは、コードの後半で HTTP ヘッダーを操作できることを意味します。

  5. [head]....[/head] を出力した後にバッファを明示的にフラッシュすると、ブラウザは HTML ストリームが完了する前にページの他のリソースのマーシャリングを開始できます。

  6. 出力をバッファにキャプチャするということは、電子メールなどの他の機能にリダイレクトしたり、コンテンツのキャッシュされた表現としてファイルにコピーしたりできることを意味します。

于 2015-01-18T00:48:03.743 に答える
32

あなたはそれを後方に持っています。ob_startはヘッダーをバッファリングせず、コンテンツをバッファリングします。を使用ob_startすると、コンテンツを表示する準備ができるまで、コンテンツをサーバー側のバッファーに保持できます。

これは一般的に、ページが「送信済み」の後にヘッダーを送信できるようにするために使用されます(つまり、ページのレンダリングの途中でリダイレクトすることを決定します)。

于 2010-12-09T18:57:43.657 に答える
16

私が好む:

ob_start();
echo("Hello there!");
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer
于 2015-03-13T12:02:57.220 に答える
5

この関数はヘッダーだけのものではありません。これで面白いことがたくさんできます。例: ページをセクションに分割して、次のように使用できます。

$someTemplate->selectSection('header');
echo 'This is the header.';

$someTemplate->selectSection('content');
echo 'This is some content.';

ここで生成された出力をキャプチャして、レイアウト内のまったく異なる 2 つの場所に追加できます。

于 2010-12-09T18:57:16.187 に答える
5

次のことは、既存の回答には記載されていません: バッファ サイズの構成 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

于 2018-08-23T07:18:29.430 に答える
0

いいえ、あなたは間違っていますが、方向は合っています;)

Output-Bufferingは、スクリプトの出力をバッファリングします。それは(要するに)echoまたはの後のすべてprintです。ヘッダーの特徴は、まだ送信されていない場合にのみ送信できるということです。しかし、HTTPによると、ヘッダーは最初の送信です。したがって、(リクエストで)初めて何かを出力すると、ヘッダーが送信され、他のヘッダーを設定することはできません。

于 2010-12-09T18:57:49.387 に答える