【PHP8.x】get_headers関数の使い方

get_headers関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

get_headers関数は、指定されたURLのHTTPヘッダー情報を取得する関数です。この関数は、ウェブサーバーがHTTPリクエストに対してどのような応答を返しているか、その詳細な情報を確認する際に利用されます。具体的には、ウェブページの最終更新日時、コンテンツの種類、リダイレクトの有無、サーバーの種類、クッキー情報など、ウェブサーバーが送信する様々なメタデータを配列として取得することができます。

例えば、特定のURLが別の場所へリダイレクトされているかどうか(Locationヘッダー)、または取得しようとしているコンテンツのタイプが画像なのかHTMLなのか(Content-Typeヘッダー)などをプログラムで確認したい場合に非常に役立ちます。関数は成功すると、各ヘッダーラインを要素とする配列を返します。配列のキーは、通常は連番の数値インデックスですが、ヘッダーフィールド名(例: 'Content-Type')をキーとして使用することも可能です。もしURLへのアクセスに失敗したり、無効なURLが指定されたりした場合には、falseを返して処理の失敗を示します。

この関数は内部的にHTTPリクエストを発行するため、ネットワーク接続が必須であり、対象のウェブサーバーの応答速度によっては実行に時間がかかることがあります。また、より詳細なリクエストの制御(例えば、ユーザーエージェントの指定、タイムアウト設定、POSTリクエストの送信など)を行いたい場合は、stream_context_create()関数と組み合わせて使用することで、その挙動をカスタマイズすることが可能です。ウェブサイトの状態監視やリンクチェック、APIの予備調査など、幅広い場面で活用できる便利な関数です。

構文(syntax)

1<?php
2$url = "https://www.example.com";
3$headers = get_headers($url);
4?>

引数(parameters)

string $url, bool $associative = false, ?resource $context = null

  • string $url: ヘッダー情報を取得したいURLを指定する文字列
  • bool $associative = false: trueを指定すると、連想配列形式でヘッダー情報を返します。デフォルトはfalseで、数値インデックスの配列で返します。
  • ?resource $context = null: リソースコンテキストを指定します。指定しない場合は、デフォルトのコンテキストが使用されます。

戻り値(return)

array|false

HTTPヘッダー情報の連想配列、またはリクエストの失敗を示すfalseが返されます。

サンプルコード

PHP get_headers()でHTTPヘッダーを取得する

1<?php
2
3/**
4 * このスクリプトは、指定されたURLのHTTPヘッダー情報を取得し、表示する方法を示します。
5 * get_headers() 関数は、Webサーバーからのレスポンスヘッダーを配列として返します。
6 *
7 * システムエンジニアを目指す初心者が、Webサイトとの基本的なやり取り(ヘッダー情報の取得)
8 * を理解するのに役立ちます。
9 */
10
11// ヘッダーを取得するターゲットURLを定義します。
12// 実際に存在するWebサイトのURLを使用してください。
13const TARGET_URL = 'https://www.example.com';
14
15echo "--- " . TARGET_URL . " からのHTTPヘッダーの取得 ---" . PHP_EOL . PHP_EOL;
16
17// 1. デフォルトモード(数値添字配列)でヘッダーを取得する
18// get_headers() の第2引数 ($associative) を false(デフォルト値)に設定すると、
19// 各ヘッダー行全体が配列の要素として返されます。
20$indexedHeaders = get_headers(TARGET_URL);
21
22if ($indexedHeaders === false) {
23    // ヘッダーの取得に失敗した場合のエラー処理
24    echo "エラー: " . TARGET_URL . " からヘッダーを取得できませんでした。" . PHP_EOL;
25} else {
26    echo "--- 数値添字配列形式のヘッダー ---" . PHP_EOL;
27    foreach ($indexedHeaders as $header) {
28        echo $header . PHP_EOL;
29    }
30    echo PHP_EOL;
31}
32
33// 2. 連想配列モードでヘッダーを取得する
34// get_headers() の第2引数 ($associative) を true に設定すると、
35// ヘッダー名が配列のキーとなり、ヘッダー値が要素となります。
36// 同じ名前のヘッダーが複数ある場合(例: Set-Cookie)、通常は最初のヘッダーのみが保持されます。
37$associativeHeaders = get_headers(TARGET_URL, true);
38
39if ($associativeHeaders === false) {
40    // ヘッダーの取得に失敗した場合のエラー処理
41    echo "エラー: " . TARGET_URL . " から連想配列形式のヘッダーを取得できませんでした。" . PHP_EOL;
42} else {
43    echo "--- 連想配列形式のヘッダー ---" . PHP_EOL;
44    foreach ($associativeHeaders as $name => $value) {
45        echo "$name: $value" . PHP_EOL;
46    }
47    echo PHP_EOL;
48}
49
50?>

PHPのget_headers関数は、指定されたURLのHTTPヘッダー情報を取得するために使用されます。Webサーバーからのレスポンスヘッダーを配列として返し、Webサイトとの基本的なやり取りにおいて、どのような情報が送受信されているかを知る上で非常に役立ちます。

この関数は、最初の引数$urlにヘッダーを取得したいWebサイトのURLを指定します。オプションの第2引数$associativeは、戻り値の配列の形式を制御します。これをfalse(デフォルト)に設定すると、各ヘッダー行全体が数値添字配列の要素として返されます。一方、trueに設定すると、ヘッダー名が配列のキーとなり、ヘッダー値が要素となる連想配列形式で取得できます。

関数が成功するとHTTPヘッダーの配列を返しますが、何らかの理由でヘッダーの取得に失敗した場合はfalseを返します。サンプルコードでは、このget_headers関数を使い、デフォルトの数値添字配列形式と、$associative引数をtrueにした連想配列形式の両方でヘッダー情報を取得し、表示する方法を示しています。これにより、Webサーバーが提供する情報を効率的に確認できます。

get_headers()関数は外部URLへのネットワークアクセスを行うため、ターゲットURLが存在しない場合やアクセスできない場合、必ずfalseを返します。この戻り値は厳密にチェックし、適切なエラー処理を記述することが非常に重要です。第2引数にtrueを指定するとヘッダーを連想配列で取得できますが、同じ名前のヘッダーが複数ある場合(例えばSet-Cookie)は、通常、値が配列として格納される点に注意が必要です。安定したヘッダーの取得のためには、第3引数の$contextでタイムアウトやリダイレクトの動作を細かく設定できることも覚えておくと良いでしょう。

PHPでPOSTリクエストのヘッダを取得する

1<?php
2
3/**
4 * 指定されたURLへPOSTリクエストを送信し、そのレスポンスヘッダを取得する関数。
5 *
6 * get_headers() 関数は、デフォルトではGETリクエストを送信してリモートサーバからの
7 * レスポンスヘッダを取得します。POSTリクエストを送信するには、ストリームコンテキスト
8 * (stream context) を使用してHTTPメソッドとPOSTデータを設定する必要があります。
9 *
10 * @param string $url POSTリクエストを送信するターゲットURL。
11 * @param array $postData POSTリクエストのボディに含めるデータ (連想配列)。
12 * @return array|false レスポンスヘッダの連想配列、または失敗した場合はfalse。
13 */
14function getHeadersFromPostRequest(string $url, array $postData): array|false
15{
16    // POSTデータを 'key=value&key2=value2' の形式にエンコードします。
17    $content = http_build_query($postData);
18
19    // ストリームコンテキストのオプションを設定します。
20    // 'http' キーの下に、HTTPリクエストに関する設定を記述します。
21    $options = [
22        'http' => [
23            // リクエストメソッドを 'POST' に設定します。
24            'method'  => 'POST',
25            // ヘッダを設定します。Content-typeはPOSTデータの形式を示し、
26            // Content-Lengthはボディのバイト数を示します。
27            'header'  => [
28                'Content-type: application/x-www-form-urlencoded',
29                'Content-Length: ' . strlen($content),
30            ],
31            // POSTリクエストのボディとしてエンコードしたデータを設定します。
32            'content' => $content,
33            // SSL/TLS証明書の検証を無効にする場合は以下を設定しますが、
34            // 本番環境では推奨されません。テスト目的で使用することがあります。
35            // 'verify_peer' => false,
36            // 'verify_peer_name' => false,
37        ],
38    ];
39
40    // 設定したオプションでストリームコンテキストを作成します。
41    $context = stream_context_create($options);
42
43    // get_headers() 関数を使用して、指定されたURLへPOSTリクエストを送信し、
44    // その応答として返されるヘッダを取得します。
45    // 第二引数に true を渡すと、ヘッダが連想配列 (ヘッダ名 => 値) で返されます。
46    // 第三引数に作成したコンテキストを渡すことで、POSTリクエストが実行されます。
47    $headers = get_headers($url, true, $context);
48
49    return $headers;
50}
51
52// --- 使用例 ---
53// httpbin.org/post は、受け取ったPOSTリクエストの情報をそのまま返す
54// テスト用のエンドポイントです。この例では、httpbin.org/post にPOSTリクエストを送り、
55// そのサーバからのレスポンスヘッダを取得します。
56$targetUrl = 'http://httpbin.org/post';
57$dataToSend = [
58    'username' => 'php_user',
59    'message'  => 'Hello from PHP get_headers!',
60];
61
62echo "ターゲットURL: " . $targetUrl . "\n";
63echo "送信データ: " . json_encode($dataToSend) . "\n\n";
64
65// 関数を呼び出してPOSTリクエストのレスポンスヘッダを取得します。
66$responseHeaders = getHeadersFromPostRequest($targetUrl, $dataToSend);
67
68if ($responseHeaders !== false) {
69    echo "--- レスポンスヘッダ ---" . "\n";
70    foreach ($responseHeaders as $name => $value) {
71        // 一部のヘッダ(例: Set-Cookie)は複数の値を持つことがあるため、配列として処理します。
72        if (is_array($value)) {
73            foreach ($value as $val) {
74                echo $name . ": " . $val . "\n";
75            }
76        } else {
77            echo $name . ": " . $value . "\n";
78        }
79    }
80} else {
81    echo "エラー: ヘッダの取得に失敗しました。URLまたはネットワーク接続を確認してください。\n";
82}

PHPのget_headers関数は、指定されたURLのリモートサーバからHTTPレスポンスヘッダを取得するために使用されます。通常はGETリクエストを送信しますが、ストリームコンテキストを利用することでPOSTリクエストも実行可能です。

サンプルコードでは、getHeadersFromPostRequest関数がPOSTリクエストによるヘッダ取得をカプセル化しています。まず、http_build_queryでPOSTデータをURLエンコードし、次にstream_context_create関数を使ってHTTPメソッドをPOSTに、ヘッダにContent-typeContent-Lengthを、そしてボディにエンコード済みデータを設定します。このコンテキストをget_headers関数の第三引数として渡すことで、POSTリクエストが実行されます。

get_headers関数の第一引数にはターゲットURLを指定します。第二引数にtrueを渡すと、ヘッダがヘッダ名と値の連想配列として返されます。第三引数には、POSTリクエストの詳細を設定したストリームコンテキストを渡します。戻り値は取得したヘッダ情報の配列、または失敗した場合はfalseとなります。この仕組みにより、クライアントはサーバーからのレスポンスヘッダを柔軟に取得できます。

get_headers関数は通常GETリクエスト用ですが、第三引数のストリームコンテキストでmethodオプションをPOSTに設定することで、POSTリクエストを送信できます。この際、http_build_queryでPOSTデータをエンコードし、Content-type: application/x-www-form-urlencodedContent-Lengthヘッダを正しく設定することが重要です。サンプルコード中のSSL/TLS証明書検証を無効にするオプションは、セキュリティリスクがあるため本番環境では絶対に使用しないでください。また、get_headersは失敗時にfalseを返すため、必ずエラーハンドリングを行いましょう。戻り値のヘッダは連想配列で返りますが、Set-Cookieのように同名のヘッダが複数ある場合、値が配列になる点にも注意が必要です。

関連コンテンツ

関連プログラミング言語

【PHP8.x】get_headers関数の使い方 | いっしー@Webエンジニア