PHP

【PHP】出力のタイミングを制御する方法

こんにちは、ともです。

フレームワークを作成する場合はレンリング処理に『アウトプットバッファリング』という機能が利用されています。

このアウトプットバッファリングという機能を利用すると、『echo』や『require』で出力が発生するタイミングを制御することができます。

PHPで出力のタイミングを制御する方法について解説していきたいと思います。

  • アウトプットバッファリングとは、出力をバッファに溜めておき、出力したいタイミングで出力させる機能である

出力のタイミングを制御したい例

アウトプットバッファリングとは、出力をバッファに溜めておき、出力したいタイミングで出力させる機能のことです。

ですので、出力のタイミングを制御するにはアウトプットバッファリングという機能が利用できます。

次のような、echoやrequireを利用すると、そのタイミングで出力されてしまいます。

echoの場合

PHPでechoで文字列を出力すると、echoが実行された時点で文字列が出力されてしまいます。

<?php

   echo "文字列1を出力します。";

   doSomething();

   echo "文字列2を出力します。";

 

上記のコードで言えば、doSomethingが実行された後に『文字列1』を出力するようなことができません。

requireの場合

<?php

   require 'Sample.php';
    doSomething();
// Sample.php
<?php
   $val = "Sample.phpです";
?>

<html>

   <?php htmlspecialchars($val) ?>

</html>

上記のようにSample.phpをrequireで読み込んだとします。

すると、phpタグで囲まれていない部分が出力されてしまい、『Sample.phpです』という文字列がrequireした時点で出力されてしまいます。

require後に、何らかの処理を実行しその後、文字列を出力したいということができません。

アウトプットバッファリングを利用する

前述のecho、requireの段階での出力されてしまう問題を解決するために、アウトプットバッファリングという機能が利用できます。

名前の通り、バッファに溜めたものを後で出力するということです。

サンプルのコードは以下です。

<?php
   // アウトプットバッファリングの開始
   ob_start();
   // バッファ上限を無効化
   ob_implicit_flush(0);
   // 下記のecho, requireはバッファに溜まる
   echo "こんにちは”;
   require "Sample.php";
  // バッファに溜めたものを取り出し、バッファをクリアしアウトプットバッファリングの終了
   $content = ob_get_clean();
   // 普通の文字列出力
   echo "バッファを取り出しました";
   // バッファの出力
   echo $content;

PHPのドキュメントを参照してください。

必要なものを下に列挙しました。

ob_start() アウトプットバッファリングの開始
ob_end_clean アウトプットバッファリングの終了とバッファのクリア
ob_implicit_flush() 引数(1):フラッシュ機能オン、引数(0):フラッシュ機能オフ
ob_get_content() バッファの内容を取得
ob_get_clean() バッファの内容を取得し、バッファのクリアと終了

サンプルコードについて解説しますと、ob_start();でアウトプットバッファリングが開始されます。

次にob_implicit_flush(0);でフラッシュ機能をオフに設定しています。バッファの上限が来ると自動で出力されてしまうので、無効化しておきます。

ob_get_clean();でバッファに溜めた内容を取得し、バッファをクリアし、アウトプットバッファリングを終了しています。

ob_get_clean();ob_get_content();の後にob_end_clean();を実行しているのと同様です。

バッファリング機能を利用しない場合、"バッファを取り出しました";より以前のものが出力されますが、バッファリング機能を利用したことにより、"バッファを取り出しました";よりも後にバッファの内容が出力できています。

まとめ

アウトプットバッファリングの機能を利用することにより、出力のタイミングを制御する方法について解説しました。

  • アウトプットバッファリングとは、出力をバッファに溜めておき、出力したいタイミングで出力させる機能である
  • ob_startでアウトプットバッファリング機能を開始
  • ob_get_cleanでバッファの内容の取得と、アウトプットバッファリングの終了