JavaScriptを有効にしてください

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

 · 

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

header()関数の基本

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

基本的な使い方

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

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

例:HTTPヘッダの操作

リダイレクト

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

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

コンテンツタイプの設定

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

このコードは、コンテンツタイプを「application/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エンジニア