• PHP
【PHP】出力バッファリング制御

出力バッファリング制御は知っている人は良く使うけど、知らない人は全く使わないという偏りがある関数群ですが、知っていると便利です。

出力バッファリングってなに?

出力バッファリングは「画面にすぐ表示せず、ためておく技術」

「すぐ表示」とは?

echoprintvar_dump()、それからHTMLそのものも、
PHPが読み込んでる最中に直接「標準出力(STDOUT)」に流れていく出力のことです

「標準出力」とは?

PHPはコマンドラインでも使えるから、そのときは echo はそのままターミナルに出力される。
でもWeb経由のPHPの場合は

「標準出力」=「クライアント(ブラウザ)に送るHTTPレスポンス本文」

ウェブサーバーで実行されるPHPファイルの場合

例1 echo

<!DOCTYPE html>
<html>
<body>
    <p>HTMLで出力1</p>
    
    <?php
    echo "<p>PHPで出力1</p>";
    echo "<p>PHPで出力2</p>";
    ?>
    
    <p">HTMLで出力2</p>
    
    <?php
    echo "<p>PHPで出力3</p>";
    ?>
</body>
</html>

HTMLで出力1

PHPで出力1

PHPで出力2

HTMLで出力2

PHPで出力3

例1 Warning

エラーについても標準出力で同様に上から順になります。

<?php
echo "1. 最初の出力";

// 存在しない変数でWarning発生
echo $undefined_variable;

echo "2. 次の出力";

// 存在しないファイルでWarning発生  
include 'nonexistent.php';

echo "3. 最後の出力";
?>

1. 最初の出力
Warning: Undefined variable $undefined_variable in /var/www/html/error-test-stdout.php on line 5
2. 次の出力
Warning: include(nonexistent.php): Failed to open stream: No such file or directory in /var/www/html/error-test-stdout.php on line 10

Warning: include(): Failed opening 'nonexistent.php' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/html/error-test-stdout.php on line 10
3. 最後の出力
出力種別どこに出る?すぐ表示?備考
echo, print, HTML標準出力(stdout)✅ すぐ表示ブラウザに出る
var_dump()標準出力✅ すぐ表示デバッグ用
fwrite(STDERR)エラー出力❌ 表示されないCLIで使うことが多い
file_put_contents()ファイル❌ 表示されないログや保存用
mail()メール❌ 表示されないサーバーから外部に送る
setcookie()ヘッダー出力❌ 表示されないbodyより先に送る必要あり

🔽 出力バッファリングを使うと

  • 出力内容を一時的にメモリ上にためておいて
  • あとからまとめて送る、あるいは加工してから送ることができる!
関数名説明
ob_start()出力バッファリングを開始する
ob_get_contents()バッファにたまっている内容を取得する
ob_end_clean()バッファの内容を消してバッファリングを終了
ob_end_flush()バッファ内容を出力してからバッファリング終了
ob_clean()バッファ内容を消去(バッファリングは継続)
ob_flush()バッファ内容を出力(バッファリングは継続)

バッファ処理が使われる主な理由

テンプレートキャプチャ

ob_start();
include 'template.php';
$content = ob_get_clean(); // テンプレートの出力を文字列として取得

出力のタイミング制御(headerより前に出力があった時)

ob_start();
echo "処理開始";
header("Location: /done.php"); // ← バッファがなければエラーになる
ob_end_flush();