ob_start、ob_get_contents関数でPHPの標準出力をバッファリング・変数に代入
2017/05/23
標準出力をバッファリングする関数 ob_start()
バッファリング関数 ob_start()とは?
PHPの出力関数である echoを実行すると、記述してあるそのタイミングで HTMLに標準出力します。
echo "出力";
HTMLのソースの中に、PHPの記述を書くと、その書いてあるところで処理され、それが「echo」「print_r()」などの標準出力(表示)する関数であればそのまま HTMLに出力されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!DOCTYPE html> <html lang="ja"> <head> : </head> <body> : <div id="contents"> <?php echo "出力"; ?> </div> : </body> </html> |
上記のような HTMLの場合は、9行目の echoは、9行目の箇所に出力されますが、記述された場所でそのまま出力されることが標準出力ということになります。
今回紹介する「ob_start()関数」は、この標準出力を出力せずにバッファリングする機能を提供してくれる関数です。
バッファリングした値を「ob_get_contents()関数」を使って変数に代入したり、「ob_end_flush()関数」を使って出力することができます。
また、「ob_start()関数」を使ってバッファリングを開始を宣言したら、「ob_end_clean()関数」を使って終了を宣言する必要があります。
ob_start()関数の使い方・基本編
1 2 3 4 5 6 7 8 9 10 11 |
echo "1"; ob_start(); // バッファリング開始 echo "2"; $buffer = ob_get_contents(); // 変数に代入 echo "3"; $buffer2 = ob_get_contents(); // 変数に代入 echo "4"; ob_end_clean(); // バッファリング終了 echo "5"; echo $buffer; echo $buffer2; |
上記のプログラムを実行すると、結果は「15223」となります。
最初の「echo」で「1」が出力された後は、「ob_start();」~「ob_end_clean();」の間はバッファリングされるために出力されません。
そして、「5」が出力された後、「ob_get_contents();」で変数「$buffer」「$buffer2」に代入された「2」「23」がそれぞれ出力されます。
変数に代入する「ob_get_contents();」を使うことでバッファリングした内容を任意のタイミングで出力することができるようになります。
また、変数に代入しますので、その値を置換したりやさらに値に代入したりすることも可能になります。
ob_start()関数の使い方・応用編
応用編として、外部ファイルを読み込む処理について考えます。
PHPの処理が記述された HTML+PHPのファイル「setting.html.php」というファイルがあったとして、これを読み込む場合は、下記のように include()関数で読み込みます。
(「include_once()関数」「require()関数」などでも OKです。)
include("setting.html.php")
ですが、include()関数の場合は、先ほどの echoと同じく、読み込んだところで処理されてしまいます。
そこで登場するのが、「ob_start()関数」なのです。
1 2 3 4 |
ob_start(); include("setting.html.php"); $buffer = ob_get_contents(); ob_end_clean(); |
上記のような記述をすることで、include()関数で読み込んだ情報は変数「$buffer」に入っていますので、必要に応じて出力をすることができます。
これを応用することで、下記のように条件分岐させて include()した情報を必要に応じて出力させることもできます。
変数に代入していますので、複数個所に出力する場合にも利用することができます。
1 2 3 4 5 6 7 8 |
ob_start(); if ( $a = "a" ) { include("setting_a.html.php"); } else { include("setting_b.html.php"); } $buffer = ob_get_contents(); ob_end_clean(); |
ob_start()関数の使い方・応用編2
ob_start()関数は、callback関数を引数として与えることができます。
下記の例は、ob_start()でバッファリングしたものに対し、str_replace()関数で文字列を置換する処理を実行しています。
同じデザインのテンプレートを、入力フォーム、入力確認画面に置換して利用する、といった使い方もできるのではないでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php function callback ( $buffer ) { // Apple を Google に置換する return (str_replace("Apple", "Google", $buffer)); } ob_start("callback"); ?> <html> <body> <p>I like Apple.</p> </body> </html> <?php ob_end_flush(); // バッファリングを出力する |
上記を実行すると、下記のように「Apple」が「Google」に置換されて出力されます。
1 2 3 4 5 |
<html> <body> <p>I like Google.</p> </body> </html> |
その他、callback関数の使い方によっては多様な処理が考えられるでしょう。
ob_start()関数に関連する関数
ここでは、ob_start()、ob_end_clean()、ob_get_contents()、ob_end_flush()を紹介しましたが、その他、下記のような関数もあるようです。
ob_gzhandler():出力バッファを gzip 圧縮するための ob_start コールバック関数
ob_iconv_handler():出力バッファハンドラとして文字エンコーディングを変換する
ob_tidyhandler():ob_tidyhandler — バッファを修正するための ob_start コールバック関数
ob_start()関数は WordPressのショートコードの処理で必要
さてさて、なんで ob_start()関数の記事を書いたのか。
実は、WordPressのショートコードで処理を作る際にどうしても必要になったのです。
ショートコードの処理を作っていく際に、HTMLは当然のように外部に持たせて、その外部ファイルを include()関数で読み込んで....
するとどういうことでしょう!!
include()を実行したタイミングで読み込んだ HTMLが出力されるじゃないですか!!
include()関数で読み込んだ値を変数に代入することもできないし...
これを解消する方法がこの標準出力をバッファリングしてくれる「ob_start()関数」だったというわけです。
WordPressに組み込む解説をした記事は「ob_start、ob_get_contentsを利用しショートコード内でinclude・WordPressプラグイン開発」に書いていますので、WordPressで使う方はこちらの記事も読んでください。
と、実は長い長い前ふり記事でした。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
ECCUBEの注文完了画面注文番号と商品情報を編集するCRITEO(クリテオ)タグを編集
ECCUBEの注文完了画面にクリテオのタグを編集する方法を紹介。標準機能では完了画面に注文IDや購入商品の情報を渡さないため改修が必要です。
-
-
ファイル変更だけ!ECCUBEの本番から開発環境をコピーする手順を解説
ECCUBEを本番から開発環境をコピーする際の手順を解説。PGMメンテに必要な開発環境を構築する手順を解説。ECCUBEの仕組みは簡単なので作業は5分ほど。
-
-
QRコード作成ライブラリ「cakePHP-QR-Code-Helper」をPHPで使うカスタマイズ
CakePHP2用のQRコード作成ライブラリ「cakePHP-QR-Code-Helper」をプレーンのPHPでも使うためのカスタマイズ方法を解説。1ファイルを設置するだけでQRコードが作れるため使い勝手がいい。
-
-
サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない
PHPでショートタグを使うのは危険。サーバ移転やバージョンアップで動かなくなる!ソースが丸見え、設定情報流出のリスクが!php.iniのshort_open_tagの設定を再確認。
-
-
JSON形式の値を配列形式に変換・PHPでは json_decode()、json_encode()
JSONとは「JavaScript Object Notation」の略でテキストベースのデータフォーマット。JSONの値をPHPで配列に変換するWebツールの紹介とその処理「json_encode()」「json_decode()」関数の解説。
-
-
ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説
ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!
-
-
CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
CentOS6系、7系のPHPバージョンを5.3から5.6、7.0、7.1にアップする作業手順と解説。yum updateコマンドを使い作業時間は約10分。コマンドの解説や引数の意味なども解説しているので役に立つはず。
-
-
ECCUBEの管理画面のSSL設定をインストール後に変更する方法
ECCUBEをインストールした後から管理画面のSSL設定を変更する方法を解説します。config.phpファイルのHTTPS_URLとADMIN_FORCE_SSLの値を変更すればOK。
-
-
ECCUBEでアップロードできない。upload_max_filesizeを設定する場所
テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。
-
-
ECCUBEの新規追加ページがInternal Server Error・Not Foundに
ECCUBEで新規追加したページがInternal Server Errorに!原因はファイルのパーミッションの場合が多くその対処方法とプログラムの修正ポイントを解説。Not Foundも解説。
Comment
初めまして。
千葉でエンジニアをしております松本と申します。
ob_startの使い方について検索していたところこのブログがヒットし、
基本編のサンプルが非常にわかりやすく、すぐに理解できました。
このようなわかりやすい例が書いてある技術ブログはなかなかないので
大変助かりました。
ありがとうございます。
松本さん、コメントありがとうございます。
「分かりやすい」と言っていただけるとすごく嬉しいですね。
私自身がネットで探してもよく分からず、悩んだことをなるべく記事にしていこうと思って書いていますが、それが役に立ったということで、すごく嬉しいですね。
今後も分かりやすい記事を書いていこうと思いますので、また見に来てくださいね!