関数の概要
headers_sent はPHPでHTTPヘッダーがすでに送信されたかどうかを確認するための関数です。PHPのスクリプト実行中にヘッダー情報を送信すると、それ以降にヘッダーを変更したり追加したりできなくなります。headers_sent を使うことで、ヘッダー送信後に処理を行おうとしてエラーになるのを防げます。
パラメータの説明
&$file(省略可能): ヘッダーが送信されたファイル名を格納する変数への参照です。ヘッダーが送信された場合にファイル名がセットされます。&$line(省略可能): ヘッダーが送信された行番号を格納する変数への参照です。ヘッダーが送信された場合に行番号がセットされます。
戻り値
ヘッダーがすでに送信されている場合は true を返し、まだ送信されていなければ false を返します。
使用例
基本的な使い方
<?php
if (headers_sent()) {
echo "ヘッダーはすでに送信されています。";
} else {
header("Content-Type: text/plain");
echo "ヘッダーを送信しました。";
}
?>
この例では、すでにヘッダーが送信されているか確認し、送信されていなければ新しいヘッダーを送信しています。
ヘッダー送信箇所の特定
<?php
$file = "";
$line = 0;
if (headers_sent($file, $line)) {
echo "ヘッダーはすでに送信されています。";
echo "ファイル: " . $file;
echo " 行番号: " . $line;
} else {
header("Location: https://example.com/");
exit;
}
?>
ヘッダーが送信されたファイルと行番号を取得することで、どこでヘッダーが送信されたかを知ることができます。デバッグに便利です。
バッファリングと組み合わせた使い方
<?php
ob_start();
header("X-My-Header: 123");
if (!headers_sent()) {
echo "まだヘッダーは送信されていません。";
}
ob_end_flush();
?>
出力バッファリングを使う場合、実際の出力はバッファがフラッシュされるまで送信されません。headers_sent はその状態もチェックできるので、バッファリング処理とうまく組み合わせて使えます。
関連する関数
header– HTTPヘッダーを送信するための関数です。header_remove– 送信済みのHTTPヘッダーを削除します。http_response_code– HTTPステータスコードを取得・設定します。ob_start/ob_end_flush– 出力バッファリングを制御します。
まとめ
headers_sent はPHPでHTTPヘッダーがすでに送信されたかを安全に確認するための便利な関数です。ヘッダー送信後にさらにヘッダー操作を行おうとするとエラーになるので、この関数を使って送信状態を事前にチェックし、エラーを回避しましょう。ファイルと行番号の取得も可能で、デバッグ時にも役立ちます。バッファリング処理と組み合わせることでより柔軟なヘッダー管理が可能になります。
