JavaScriptを有効にしてください

PHPのheader()関数:初心者向けガイド

 · 

PHPのheader()関数:初心者向けガイド

PHPにおけるheader()関数は、HTTPヘッダを操作するための強力なツールです。
この記事では、header()関数の基本的な使い方とその重要性を紹介します。

header()関数の基本

PHPのheader()関数は、生のHTTPヘッダを送信します。
この関数を使用すると、ブラウザに対して特定の命令を送信することができます。

基本的な使い方

1
header('Content-Type: text/plain');

このコードは、コンテンツタイプを「テキスト/プレーン」に設定します。

例:HTTPヘッダの操作

リダイレクト

1
header('Location: https://example.com');

このコードは、ブラウザをhttps://example.comにリダイレクトします。

コンテンツタイプの設定

1
header('Content-Type: application/json');

このコードは、コンテンツタイプを「アプリケーション/JSON」に設定します。
これは、JSONデータを出力するAPIを作成する際に便利です。

header()の注意点

header()関数は、どんな出力も送信される前に呼び出す必要があります。
出力後にheader()を呼び出すと、エラーが発生します。
セキュリティと互換性を確保するために、適切なHTTPヘッダを設定することが重要です。

出力後にheader関数を呼び出した際のエラー

もし何らかの出力(たとえばechoやHTMLタグ、空白や改行など)が既に行われた後にheader()関数を呼び出すと、PHPは「headers already sent(ヘッダーは既に送信された)」というエラーを発生させます。

「headers already sent」エラー

1
Warning: Cannot modify header information - headers already sent by (output started at /path/to/php/file.php:line) in /path/to/php/file.php on line XX

このエラーメッセージには、次の情報が含まれます:

  1. エラーの種類:Cannot modify header information(ヘッダー情報を変更できない)
  2. エラーの理由:headers already sent(ヘッダーは既に送信された)
  3. 出力の開始場所:出力が開始されたファイルと行番号
  4. エラー発生場所:header()関数が呼び出されたファイルと行番号

エラーの発生原因

早期の出力:PHPファイルの先頭にある余分な空白や改行、echoやprintなどの出力関数の使用。
BOM(Byte Order Mark)の存在:UTF-8のBOMがファイルの先頭に含まれている場合。

解決策

  • 出力の遅延:header()関数を呼び出す前に、すべての出力を避けます。
  • 出力バッファリングの使用:ob_start()で出力バッファリングを開始し、header()関数の後でob_end_flush()やob_get_clean()を使用してバッファをフラッシュまたは取得します。
  • ファイルの確認:ファイルの先頭に余分な空白や改行がないことを確認し、BOMがないことを確認します。

出力バッファリングの使用例

こちらは少し複雑なので実際のコード例を用いて解説します。

1. 出力バッファリングの有効化

出力バッファリングを有効にするには、スクリプトの最初にob_start()関数を呼び出します。
これにより、出力バッファリングが開始されます。

1
2
<?php
ob_start();

2. ヘッダの送信

バッファリングが有効な状態で、どのタイミングでも安全にヘッダを送信できます。

1
2
echo 'test';
header('Content-Type: application/json');

header関数の前にtestというテキストを出力してますが、ob_start関数でバッファリングしているためまだブラウザに送信されていません。
そのためechoの後にheader関数を使用してもheaders already sentのエラーは出ません。

3. バッファのフラッシュ

最後に、出力バッファリングを終了し、バッファに溜まった内容をクライアント(ブラウザ)に送信するためにob_end_flush()を呼び出します。
または、バッファの内容を取得してからクリアするためにob_get_clean()を使用することもできます。

1
2
3
4
ob_end_flush();
// または
$content = ob_get_clean();
echo $content;

ここでob_end_flush関数を呼び出した時、またはob_get_clean関数で$content変数に先ほどのtestの文字列が代入されechoでブラウザに送信される流れになります。

実用的な例

上記を踏まえて下記の例では、ユーザーを別のページにリダイレクトする前に出力バッファリングを使用しています。
これにより、リダイレクトの命令(header(‘Location: …’))を出力が行われた後でも安全に発行できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
ob_start();

// ここでHTMLコンテンツやその他の出力を行うことができます
echo "<h1>このページはリダイレクトされます</h1>";

// リダイレクトヘッダを送信
header('Location: https://example.com');

// バッファをフラッシュして出力を送信
ob_end_flush();

このように出力バッファリングを使用することで、「headers already sent」エラーを回避しつつ、PHPスクリプト内で動的にヘッダを管理する柔軟性が得られます。

まとめ

PHPのheader()関数は、HTTPヘッダを操作し、ブラウザの振る舞いを制御するために不可欠です。
この記事で紹介した基本的な使い方と例を参考にして、あなたのPHPプログラミングに柔軟性と機能性を加えましょう。


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア