【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-typeやContent-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-urlencodedとContent-Lengthヘッダを正しく設定することが重要です。サンプルコード中のSSL/TLS証明書検証を無効にするオプションは、セキュリティリスクがあるため本番環境では絶対に使用しないでください。また、get_headersは失敗時にfalseを返すため、必ずエラーハンドリングを行いましょう。戻り値のヘッダは連想配列で返りますが、Set-Cookieのように同名のヘッダが複数ある場合、値が配列になる点にも注意が必要です。
PHPでURLのHTTPヘッダーを取得する
1<?php 2 3/** 4 * 指定されたURLからHTTPレスポンスヘッダーを取得し、表示する関数。 5 * 6 * get_headers関数は、PHPの組み込み関数であり、HTTP HEADリクエストを送信して 7 * サーバーからのレスポンスヘッダーを配列として取得します。 8 * これは、cURLライブラリを明示的に使用することなく、URLのヘッダー情報を 9 * 取得するシンプルな方法です。 10 * 11 * @param string $url ヘッダーを取得する対象のURL。 12 * @return void 13 */ 14function fetchHttpHeadersFromUrl(string $url): void 15{ 16 echo "--- 対象URL: " . $url . " ---\n\n"; 17 18 // get_headers関数を使用してHTTPヘッダーを取得します。 19 // 第2引数 $associative を true に設定すると、ヘッダー名をキーとする連想配列として取得できます。 20 // 例: ['Content-Type' => 'text/html; charset=UTF-8', 'Server' => 'gws'] 21 $headersAssociative = get_headers($url, true); 22 23 if ($headersAssociative === false) { 24 echo "エラー: URL '" . $url . "' からヘッダーの取得に失敗しました。\n"; 25 echo "URLが正しいか、またはアクセス可能か確認してください。\n"; 26 return; 27 } 28 29 echo "--- 取得したHTTPヘッダー (連想配列形式) ---\n"; 30 foreach ($headersAssociative as $name => $value) { 31 // 同じ名前のヘッダーが複数存在する場合 (例: 'Set-Cookie')、 32 // $value は文字列ではなく配列になります。 33 if (is_array($value)) { 34 foreach ($value as $val) { 35 echo $name . ": " . $val . "\n"; 36 } 37 } else { 38 echo $name . ": " . $value . "\n"; 39 } 40 } 41 42 echo "\n--- 取得したHTTPヘッダー (数値インデックス配列形式) ---\n"; 43 // associative を false (デフォルト) に設定して再取得します。 44 // この場合、各ヘッダー行全体が配列の要素となります。 45 // 例: ['HTTP/1.1 200 OK', 'Content-Type: text/html; charset=UTF-8'] 46 $headersIndexed = get_headers($url, false); 47 48 if ($headersIndexed === false) { 49 echo "エラー: 数値インデックス形式でのヘッダー取得に失敗しました。\n"; 50 return; 51 } 52 53 foreach ($headersIndexed as $headerLine) { 54 echo $headerLine . "\n"; 55 } 56 57 echo "\n-------------------------------------------------\n\n"; 58} 59 60// サンプルとして、一般的なWebサイトのURLを指定します。 61$targetUrl = 'https://www.google.com/'; 62 63// 関数を実行してヘッダーを表示します。 64fetchHttpHeadersFromUrl($targetUrl); 65 66// 別のURLで試すことも可能です(コメントアウトを解除して使用)。 67// $anotherUrl = 'https://www.php.net/'; 68// fetchHttpHeadersFromUrl($anotherUrl); 69 70// 存在しないURLやアクセスできないURLの場合、エラーが発生します。 71// $invalidUrl = 'http://non-existent-domain-example.com/'; 72// fetchHttpHeadersFromUrl($invalidUrl); 73 74?>
このPHPサンプルコードは、get_headers関数を使って指定されたURLのHTTPレスポンスヘッダーを取得し、その内容を表示する方法を示しています。get_headers関数は、cURLライブラリを明示的に使うことなく、サーバーからヘッダー情報を直接取得できる便利な組み込み関数です。
関数はstring $urlを必須の引数として取り、ヘッダーを取得する対象のURLを指定します。戻り値はヘッダー情報を格納したarray、または取得に失敗した場合はfalseを返します。
サンプルでは、まず$associative引数をtrueに設定してget_headersを呼び出し、ヘッダー名をキー、ヘッダー値を値とする連想配列形式で取得しています。これにより、特定のヘッダー名(例:Content-Type)にアクセスしやすくなります。ただし、Set-Cookieのように同じヘッダーが複数ある場合は、その値が配列として格納されるため、表示時にその点を考慮しています。
次に、$associative引数をfalse(デフォルト値)で呼び出すことで、HTTPステータスラインや各ヘッダー行全体を要素とする数値インデックス配列形式で取得し、表示しています。
いずれの場合も、ヘッダーの取得に失敗した際はfalseが返されるため、そのエラー処理を行うことで、URLの誤りやネットワークの問題による失敗に対応しています。これにより、システムエンジニアの初心者の方でも、Webサイトのヘッダー情報を簡単に確認し、デバッグや情報収集に役立てることができます。
get_headers関数は、cURLを使わずにURLのHTTPヘッダーを手軽に取得できますが、成功時はヘッダー情報の配列、失敗時はfalseを返すため、常に戻り値を確認し、エラー処理を行うことが重要です。特に、第2引数をtrueにして連想配列で取得する際、Set-Cookieのように同じヘッダーが複数ある場合、その値は文字列ではなく配列として返されますので、この点に注意してコードを記述してください。falseが返された際は、指定したURLが正しいか、またはアクセス可能かを確認しましょう。より高度な設定(タイムアウトやプロキシなど)が必要な場合は、第3引数$contextを利用できます。
PHPでcURLを使ったHTTPヘッダー取得処理
1<?php 2 3/** 4 * get_headers()関数の代替としてcURLを使用する関数。 5 * 6 * この関数は、HEADリクエストを実行し、レスポンスヘッダーを数値添字配列として返すことで、 7 * get_headers()のデフォルトの挙動を模倣します。 8 * get_headers()と同様に、デフォルトでリダイレクトを追跡します。 9 * 10 * @param string $url ヘッダーを取得するURL。 11 * @return array|false 成功した場合はヘッダー文字列の配列、失敗した場合はfalse。 12 */ 13function getHeadersAlternative(string $url): array|false 14{ 15 // cURLセッションを初期化 16 $ch = curl_init(); 17 18 if ($ch === false) { 19 // cURLの初期化に失敗した場合 20 return false; 21 } 22 23 // リクエスト対象のURLを設定 24 curl_setopt($ch, CURLOPT_URL, $url); 25 26 // 転送結果を直接出力せず、文字列として返すように設定 27 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 28 29 // レスポンスヘッダーを結果に含めるように設定 30 curl_setopt($ch, CURLOPT_HEADER, true); 31 32 // レスポンスボディを含めないように設定(これにより実質的にHEADリクエストとなる) 33 curl_setopt($ch, CURLOPT_NOBODY, true); 34 35 // HTTPリダイレクト('Location:'ヘッダー)を自動的に追跡 36 // これはget_headers()のデフォルトの挙動に似ています 37 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 38 39 // 接続とデータ転送のタイムアウトを設定 40 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 接続タイムアウト:10秒 41 curl_setopt($ch, CURLOPT_TIMEOUT, 15); // 総転送タイムアウト:15秒 42 43 // cURLリクエストを実行し、レスポンスを取得 44 $response = curl_exec($ch); 45 46 // cURLのエラーが発生したかチェック 47 if (curl_errno($ch)) { 48 // エラーが発生した場合はセッションを閉じ、falseを返す 49 curl_close($ch); 50 return false; 51 } 52 53 // cURLセッションを閉じる 54 curl_close($ch); 55 56 // レスポンスが空の場合(通常はcURLエラーで捕捉されるが、念のため) 57 if ($response === false) { 58 return false; 59 } 60 61 // レスポンス文字列からヘッダー行を抽出 62 // まずtrim()で前後の空白を除去し、改行コード(\r\n)で分割 63 // その後、array_filter()で空の行を削除 64 $headerLines = array_filter( 65 explode("\r\n", trim($response)), 66 fn($line) => trim($line) !== '' 67 ); 68 69 // get_headers()と同様に、各ヘッダー行は「Header-Name: Value」形式の文字列として返されます 70 return $headerLines; 71} 72 73// === サンプル使用例 === 74// ヘッダーを取得したいURLを指定します 75$testUrl = 'https://www.google.com'; 76 77// getHeadersAlternative関数を呼び出してヘッダーを取得 78$headers = getHeadersAlternative($testUrl); 79 80// 取得結果を表示 81if ($headers === false) { 82 echo "エラー: {$testUrl} のヘッダーを取得できませんでした。\n"; 83} else { 84 echo "{$testUrl} のヘッダー:\n"; 85 foreach ($headers as $header) { 86 echo " " . $header . "\n"; 87 } 88}
PHPのget_headers関数は、指定されたURLのHTTPヘッダー情報を取得するための機能です。ウェブサーバーがクライアントに返す情報(例えば、コンテンツの種類、サーバーソフトウェア、キャッシュ設定、リダイレクト情報など)を確認する際に利用されます。
この関数は、第一引数$urlにヘッダーを取得したいウェブアドレスを文字列で指定します。オプションの第二引数$associativeをtrueに設定すると、ヘッダー名をキーとした連想配列で結果が返されますが、デフォルトのfalseでは数値添字配列となります。第三引数$contextは、ネットワーク接続に関するより詳細な設定(例えば、タイムアウト値やプロキシ設定など)を行うためのリソースを指定できます。
関数が正常に実行されると、取得したヘッダー情報を含む配列が返されます。ヘッダーの取得に失敗した場合はfalseが返されます。
サンプルコードでは、get_headers関数が使用できない環境や、より詳細な制御が必要な場合に備え、PHPのcURLライブラリを用いた代替関数getHeadersAlternativeが提供されています。この代替関数は、cURLの機能を使い、HEADリクエストを発行することで、指定されたURLからHTTPヘッダーのみを取得します。リダイレクトも自動的に追跡し、接続やデータ転送のタイムアウト設定なども細かく行える点が特徴です。
サンプル使用例では、https://www.google.comのヘッダーをgetHeadersAlternative関数で取得し、その結果を画面に表示しています。エラーが発生した場合には、その旨がメッセージとして出力されるように実装されています。
このサンプルコードは、PHPのget_headers関数の代わりに、cURL拡張機能を利用してHTTPヘッダーを取得する方法を示しています。cURLを使う際は、PHP環境でcURLが有効になっていることを事前に確認してください。ネットワークの状況によって処理が長時間停止するのを防ぐため、CURLOPT_CONNECTTIMEOUTとCURLOPT_TIMEOUTで接続と転送のタイムアウト値を適切に設定することが非常に重要です。また、外部URLへのリクエストは、予期せぬエラーやリダイレクトの挙動が発生する可能性があるため、エラーハンドリングが適切に行われているか、信頼できるURLのみを指定しているかを確認するように心がけてください。取得されるヘッダーは文字列の配列形式なので、特定の値が必要な場合はさらにパースが必要になります。