headers_sent

関数の概要

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ヘッダーがすでに送信されたかを安全に確認するための便利な関数です。ヘッダー送信後にさらにヘッダー操作を行おうとするとエラーになるので、この関数を使って送信状態を事前にチェックし、エラーを回避しましょう。ファイルと行番号の取得も可能で、デバッグ時にも役立ちます。バッファリング処理と組み合わせることでより柔軟なヘッダー管理が可能になります。