はじめに
PHP では setcookie()
や header()
のようなヘッダ操作関数は、画面出力前に呼び出す必要があります。しかし、テストや開発中に echo
などで出力してしまい、よく「Cannot modify header information」のエラーに遭遇することがあります。
本記事では、PHP の 出力バッファリング (ob_start()
) を使ってヘッダ操作を安全に行う方法と、ob_end_flush()
/ ob_end_clean()
の違いをわかりやすく解説します。
目次
出力バッファリングとは?
- ob_start() でバッファリング開始
- 出力は一旦メモリにためられ、ブラウザには送信されない
- ヘッダ操作関数は出力前に呼び出せる
ob_end_flush() と ob_end_clean() の違い
例:ob_end_flush()
<?php
ob_start();
echo 'text';
setcookie('exam', 'value');
ob_end_flush();
- 出力
'text'
が画面に表示 - Cookie も正常に設定
- ✅ 安全
例:ob_end_clean()
<?php
ob_start();
echo 'text';
setcookie('exam', 'value');
ob_end_clean();
- 出力は破棄される(画面には表示されない)
- Cookie は設定される場合もあるが、既に出力がある場合は Warning が出る可能性あり
- ⚠️完全に安全とは言えない(とりあえず使える)
図解:処理の流れ
ob_start() → echo → setcookie() → ob_end_flush() → 画面に表示 & Cookie設定
ob_start() → echo → setcookie() → ob_end_clean() → 画面には表示されず、Cookie設定は場合による
まとめ
- 出力バッファリングは「ヘッダ操作を安全にする保険」
ob_end_flush()
でバッファを出力するob_end_clean()
はバッファを破棄するだけで、ヘッダ操作の安全性は保証されない- 上級試験では、ヘッダ関数は出力前に呼ぶ のが基本