【PHP8.x】ob_get_clean関数の使い方

作成日: 更新日:

ob_get_clean関数は、PHPの出力バッファリング機能に関連する関数です。この関数は、現在アクティブな出力バッファの内容をすべて取得し、そのバッファを消去すると同時に、バッファリングを終了(無効化)する役割を持ちます。

通常、PHPスクリプトがechoやprintなどで生成する出力は、すぐにウェブブラウザなどのクライアントに送られますが、出力バッファリングを有効にすると、それらの出力は一時的にメモリに蓄えられます。ob_start関数などで出力バッファリングを開始した後、ob_get_clean関数を使用することで、この蓄えられた内容を一括して取得し、変数に格納することができます。

これにより、HTMLコードなどを直接出力する代わりに、いったん変数に保持して後で加工したり、条件に応じて出力するかどうかを決めたりすることが可能になります。取得と同時にバッファがクリアされ、バッファリング自体も停止するため、余分なメモリを消費することなく、次の処理に進むことができます。

成功した場合はバッファの内容を文字列として返し、バッファリングがアクティブでない場合はfalseを返します。例えば、特定の処理の出力だけをキャプチャしてログに記録したり、部分的なHTMLを生成してメインのテンプレートに組み込んだりする際に非常に便利です。

基本的な使い方

構文(syntax)

<?php
ob_start();
echo "バッファされた出力です。";
$output = ob_get_clean();
echo "ob_get_clean() が取得した内容: " . $output;
?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string|false

ob_get_clean関数の戻り値は、バッファリングされた出力全体、またはエラー発生時にはfalseです。

サンプルコード

PHP ob_get_clean でHTMLを文字列化する

<?php

declare(strict_types=1);

/**
 * 出力バッファリングを利用して、動的なHTMLコンテンツを生成し、
 * 文字列として取得するサンプル関数です。
 *
 * この例では、ユーザーリストからHTMLの<ul><li>リストを生成します。
 *
 * @param array $items リストに表示する項目の配列
 * @return string 生成されたHTMLコンテンツ
 */
function createHtmlList(array $items): string
{
    // 出力バッファリングを開始します。
    // これ以降の echo による出力は、直接ブラウザに送信されず、
    // 内部のメモリバッファに蓄えられます。
    ob_start();

    // HTMLのリストをバッファに出力します。
    echo '<h2>ユーザーリスト</h2>' . PHP_EOL;
    echo '<ul>' . PHP_EOL;
    foreach ($items as $item) {
        // 安全のため、HTMLに出力する内容はエスケープします。
        echo '    <li>' . htmlspecialchars($item, ENT_QUOTES, 'UTF-8') . '</li>' . PHP_EOL;
    }
    echo '</ul>' . PHP_EOL;

    // ob_get_clean() は、バッファに蓄えられた内容をすべて文字列として取得し、
    // 同時に出力バッファを空にして、バッファリングを終了します。
    // 取得した文字列は、この関数の戻り値として返されます。
    return ob_get_clean();
}

// 表示するユーザー名のデータ
$users = ['Alice', 'Bob', 'Charlie'];

// 関数を呼び出して、HTMLコンテンツを文字列として変数に格納します。
// この時点では、まだ何も画面に出力されません。
$htmlOutput = createHtmlList($users);

// 別の処理を挟むことができます。
$logMessage = 'HTMLリストを生成しました。文字数: ' . mb_strlen($htmlOutput);
// file_put_contents('app.log', $logMessage . PHP_EOL, FILE_APPEND);

// 準備が整ったら、変数に格納しておいたHTMLコンテンツをまとめて出力します。
header('Content-Type: text/plain; charset=utf-8');
echo "--- ここから生成されたコンテンツ ---" . PHP_EOL;
echo $htmlOutput;
echo "--- ここまで ---" . PHP_EOL;

?>

ob_get_clean関数は、出力バッファの内容を文字列として取得し、そのバッファを削除して出力バッファリングを終了します。この関数は、ob_start関数とセットで使います。ob_startを呼び出すと、それ以降のechoなどによる出力はWebサーバーへ直接送信されず、PHPの内部メモリ(バッファ)に一時的に蓄えられます。

サンプルコードのcreateHtmlList関数では、まずob_startでバッファリングを開始します。次に、echoを使ってHTMLのリストを組み立てていますが、この時点ではまだ何も出力されません。生成されるHTMLは全てバッファに蓄積されていきます。関数の最後でob_get_cleanを呼び出すと、それまでバッファに蓄積された全てのHTMLコンテンツが、一つの文字列として取得され、関数の戻り値となります。同時に、バッファは空になり、バッファリングも終了します。

この関数に引数はありません。戻り値は、バッファの内容である文字列、またはアクティブなバッファが存在しない場合にfalseを返します。この機能により、プログラムが生成する出力を一度変数に格納し、後からファイルに保存したり、まとめて送信したりといった柔軟な処理が可能になります。

このコードは、ob_start()で出力バッファリングを開始し、echoされた内容を直接表示せずにメモリへ一時的に保存します。注意点として、ob_start()を呼び出した後は、必ず対になるob_get_clean()などでバッファを閉じる必要があります。閉じ忘れると、意図しない出力やエラーの原因となる可能性があります。ob_get_clean()は「バッファ内容の取得」と「バッファの消去・終了」を同時に行います。もし内容を取得するだけでバッファリングを続けたい場合は、ob_get_contents()を使用します。この仕組みは、動的に生成したHTMLをメール本文やファイルに書き出すなど、一度文字列として扱いたい場合に特に有効です。

【PHP8.x】ob_get_clean関数の使い方 | いっしー@Webエンジニア