【PHP8.x】CURLOPT_HEADER定数の使い方
CURLOPT_HEADER定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLOPT_HEADER定数は、PHPのcURL拡張機能において、HTTPリクエストのレスポンスにヘッダー情報を含めるかどうかを制御するためのオプションを表す定数です。この定数は、curl_setopt()関数で使用され、その値として真偽値(trueまたはfalse)を設定します。
CURLOPT_HEADERにtrueを設定すると、cURLがHTTPリクエストを実行した際に受け取るレスポンスにおいて、HTTPヘッダー情報がボディ(本体)の内容とともに出力に含まれるようになります。これにより、例えばWebページのステータスコードやContent-Typeなどのメタデータを取得し、それに基づいて処理を分岐させたり、デバッグ情報として利用したりすることが可能になります。
一方、falseを設定するか、このオプションを特に指定しない場合(デフォルトの動作)は、レスポンスのヘッダー情報は出力に含まれず、ボディの内容のみが取得されます。純粋にコンテンツの本文だけが必要な場合や、ヘッダー情報を明示的に無視したい場合に便利です。
通常、CURLOPT_HEADERはCURLOPT_RETURNTRANSFERオプションと組み合わせて使用されることが多く、CURLOPT_RETURNTRANSFERがtrueに設定されている場合、CURLOPT_HEADERもtrueにすることで、ヘッダーとボディの両方を含む完全なHTTPレスポンス全体を文字列として取得し、PHPスクリプト内で細かく解析できるようになります。これにより、柔軟なWeb通信処理を構築できます。
構文(syntax)
1<?php 2$ch = curl_init(); 3curl_setopt($ch, CURLOPT_HEADER, true); 4curl_close($ch); 5?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP cURLでヘッダーをカスタム処理する
1<?php 2 3/** 4 * cURLリクエストを行い、受信したHTTPヘッダーをカスタム関数で処理するサンプル。 5 * 6 * CURLOPT_HEADER 定数 (レスポンス出力にヘッダーを含めるかどうか) と 7 * CURLOPT_HEADERFUNCTION (受信ヘッダーを処理するコールバック関数) の使用例を示します。 8 * システムエンジニアを目指す初心者向けに、HTTPヘッダーのカスタム処理の基本を解説します。 9 * 10 * @param string $url リクエストを送信するURL 11 * @return void 12 */ 13function fetchUrlWithCustomHeaderProcessing(string $url): void 14{ 15 // cURLセッションを初期化します。 16 $ch = curl_init(); 17 18 // 受信したHTTPヘッダー行を格納するための配列です。 19 // クロージャ内でこの変数にアクセスできるよう、参照渡し (use &) を使用します。 20 $receivedHeaders = []; 21 22 // cURLオプションを設定します。 23 curl_setopt($ch, CURLOPT_URL, $url); // リクエスト先のURLを設定 24 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // レスポンスを文字列として取得し、直接出力しないように設定 25 26 // CURLOPT_HEADER 定数の利用: 27 // これはレスポンスの出力にHTTPヘッダーを含めるかどうかを制御します。 28 // ここでは、ヘッダーをカスタム関数 (CURLOPT_HEADERFUNCTION) で処理するため、 29 // レスポンスボディにヘッダーが混ざらないように `false` に設定します。 30 // もし `true` に設定すると、CURLOPT_RETURNTRANSFER が `true` の場合、 31 // 戻り値の文字列の先頭にヘッダーが含まれることになります。 32 curl_setopt($ch, CURLOPT_HEADER, false); 33 34 // CURLOPT_HEADERFUNCTION の利用: 35 // 受信したヘッダー行を処理するためのコールバック関数を設定します。 36 // この関数は、レスポンスの各ヘッダー行を受信するたびに呼び出されます。 37 // $curl: cURLリソース (通常は $ch と同じ)。 38 // $headerLine: 受信したヘッダー行の文字列。 39 curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $headerLine) use (&$receivedHeaders) { 40 // ヘッダー行をトリム (前後の空白を除去) して、空でない場合のみ処理します。 41 // 空行はヘッダーの終わりを示す場合があります。 42 $trimmedHeader = trim($headerLine); 43 if (!empty($trimmedHeader)) { 44 $receivedHeaders[] = $trimmedHeader; // ヘッダー行を配列に追加 45 } 46 // コールバック関数は、処理されたヘッダー行のバイト数を返す必要があります。 47 return strlen($headerLine); 48 }); 49 50 // cURLセッションを実行し、レスポンスのボディ部分を取得します。 51 $responseBody = curl_exec($ch); 52 53 // エラーが発生した場合は、エラーメッセージを表示します。 54 if (curl_errno($ch)) { 55 echo 'cURLエラー: ' . curl_error($ch) . PHP_EOL; 56 } else { 57 // 成功した場合、カスタム関数で収集したヘッダーを表示します。 58 echo '--- 受信したHTTPヘッダー ---' . PHP_EOL; 59 foreach ($receivedHeaders as $header) { 60 echo $header . PHP_EOL; 61 } 62 echo PHP_EOL; 63 64 // レスポンスボディを表示します。 65 echo '--- レスポンスボディ (抜粋) ---' . PHP_EOL; 66 // JSON形式のレスポンスの場合、整形して表示し、長すぎる場合は一部のみ表示します。 67 $jsonDecoded = json_decode($responseBody, true); 68 if (json_last_error() === JSON_ERROR_NONE) { 69 $displayLimit = 5; // 表示するJSON要素の最大数 70 $limitedData = array_slice($jsonDecoded, 0, $displayLimit); 71 echo json_encode($limitedData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . PHP_EOL; 72 if (count($jsonDecoded) > $displayLimit) { 73 echo "(他 " . (count($jsonDecoded) - $displayLimit) . " 要素省略)..." . PHP_EOL; 74 } 75 } else { 76 // JSONでない場合、最初の500文字のみ表示します。 77 echo substr($responseBody, 0, 500) . (strlen($responseBody) > 500 ? '...' : '') . PHP_EOL; 78 } 79 } 80 81 // cURLセッションを閉じ、リソースを解放します。 82 curl_close($ch); 83} 84 85// 実際の使用例: GitHub APIのユーザー情報を取得するURL。 86// このURLは公開されており、認証なしでアクセス可能です。 87fetchUrlWithCustomHeaderProcessing('https://api.github.com/users/octocat');
このPHPサンプルコードは、cURLを使用してHTTPリクエストを送信し、その際に受信するHTTPヘッダーをカスタム関数で処理する基本的な方法を、システムエンジニアを目指す初心者向けに示しています。
まず、CURLOPT_HEADERは、cURLリクエストのレスポンス出力にHTTPヘッダーを含めるかどうかを制御する定数です。このサンプルでは、ヘッダー情報をカスタム関数で個別に扱うため、CURLOPT_HEADERをfalseに設定しています。これにより、レスポンスボディとヘッダーが混ざることなく、別々に処理できるようになります。
次に、CURLOPT_HEADERFUNCTIONは、受信したHTTPヘッダーの各行を処理するためのコールバック関数を設定するために使用します。このコールバック関数は、HTTPレスポンスからヘッダー行を受け取るたびに自動的に呼び出されます。コールバック関数は引数としてcURLリソースと受信したヘッダー行の文字列($headerLine)を受け取ります。そして、処理したヘッダー行のバイト数(strlen($headerLine))を戻り値として返す必要があります。このコードでは、コールバック関数内で受信した各ヘッダー行を$receivedHeaders配列に格納しています。
このように、CURLOPT_HEADERとCURLOPT_HEADERFUNCTIONを組み合わせることで、HTTPリクエストのヘッダー部分を細かく制御し、特定のヘッダー情報を抽出したり、アプリケーションの要件に応じてカスタム処理を行ったりすることが可能になります。リクエスト実行後には、収集されたヘッダー情報とレスポンスボディがそれぞれ表示されます。
このサンプルコードはHTTPヘッダーのカスタム処理について解説しています。CURLOPT_HEADER定数は、curl_execで取得するレスポンスにHTTPヘッダーを含めるかどうかを制御します。これをtrueに設定すると、レスポンスボディとヘッダーが混ざって返されるため、個別に処理したい場合はfalseに設定するのが一般的です。ヘッダーを個別に処理するには、CURLOPT_HEADERFUNCTIONオプションを使用し、カスタムのコールバック関数を指定します。このコールバック関数は、受信した各ヘッダー行のバイト数を必ず返す必要があります。これを忘れるとcURLが正常に動作しない可能性があります。また、コールバック関数内で外部の変数にヘッダー情報を格納する場合は、use (&$変数名)構文で参照渡しを行うようにしてください。ヘッダー行は前後の空白を除去し、空行を除外してから処理することをお勧めします。
PHP cURLでレスポンスヘッダーを取得する
1<?php 2 3/** 4 * 指定されたURLにHTTP GETリクエストを送信し、 5 * レスポンスヘッダーとボディの両方を取得して表示します。 6 * 7 * システムエンジニアを目指す初心者向けに、cURLの基本的な使用方法と 8 * CURLOPT_HEADER オプションの役割を具体的に示します。 9 * 10 * @param string $url リクエストを送信するURL 11 * @return void 12 */ 13function fetchUrlWithHeaders(string $url): void 14{ 15 // 1. cURLセッションを初期化します。 16 // curl_init() は新しいcURLセッションを確立し、そのハンドルを返します。 17 $ch = curl_init(); 18 19 // セッション初期化が失敗した場合のチェック 20 if ($ch === false) { 21 echo "エラー: cURLセッションの初期化に失敗しました。\n"; 22 return; 23 } 24 25 // 2. cURLオプションを設定します。 26 // curl_setopt() を使って、リクエストの挙動を詳細に設定できます。 27 28 // リクエストを送信するURLを設定 29 curl_setopt($ch, CURLOPT_URL, $url); 30 31 // 実行結果を直接出力せず、文字列として返すように設定します。 32 // これにより、取得したデータを変数に格納して操作できるようになります。 33 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 34 35 // ★ここが重要★ 36 // CURLOPT_HEADER を true に設定すると、HTTPレスポンス全体に 37 // ヘッダー情報(例: HTTP/1.1 200 OK, Content-Typeなど)が含まれるようになります。 38 // これを false にすると、ヘッダーは含まれず、レスポンスボディのみが返されます。 39 curl_setopt($ch, CURLOPT_HEADER, true); 40 41 // 3. cURLリクエストを実行し、結果を取得します。 42 // curl_exec() は、設定されたオプションに基づいてリクエストを実行します。 43 // 成功するとレスポンスデータを、失敗すると false を返します。 44 $response = curl_exec($ch); 45 46 // 4. エラーチェックと結果の表示を行います。 47 if ($response === false) { 48 // エラーが発生した場合、curl_error() で詳細なエラーメッセージを取得できます。 49 echo "エラー: cURLリクエストの実行中に問題が発生しました: " . curl_error($ch) . "\n"; 50 } else { 51 // CURLOPT_HEADER が true の場合、レスポンスにはヘッダーとボディの両方が含まれます。 52 // curl_getinfo() を使用してヘッダーのサイズを取得し、ヘッダーとボディを分離します。 53 $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 54 $headers = substr($response, 0, $header_size); 55 $body = substr($response, $header_size); 56 57 echo "--- URL: {$url} からのレスポンス情報 ---\n\n"; 58 59 echo "--- レスポンスヘッダー ---\n"; 60 // ヘッダーの末尾に余分な改行が含まれることがあるため、rtrimで整形します。 61 echo rtrim($headers) . "\n\n"; 62 63 echo "--- レスポンスボディ (最初の200文字) ---\n"; 64 // ボディが非常に長い可能性があるため、最初の200文字のみを表示します。 65 echo substr($body, 0, 200) . (strlen($body) > 200 ? "..." : "") . "\n"; 66 } 67 68 // 5. cURLセッションを閉じます。 69 // リソースを解放するために、必ずセッションを閉じましょう。 70 curl_close($ch); 71} 72 73// 関数の使用例: 74// 実際にアクセスできる任意のURLを指定してください。 75$target_url = "https://www.example.com"; 76echo "{$target_url} へのリクエストを送信し、ヘッダー情報を含めて取得します。\n\n"; 77fetchUrlWithHeaders($target_url); 78 79?>
このPHPサンプルコードは、cURLライブラリを使用して指定されたURLへHTTP GETリクエストを送信し、そのレスポンス(応答)からHTTPヘッダー情報とコンテンツボディの両方を取得して表示する方法を、システムエンジニアを目指す初心者向けに示しています。
コードの中心となるのは、curl_setopt($ch, CURLOPT_HEADER, true);という行です。ここで定数CURLOPT_HEADERをtrueに設定することで、cURLが実行するリクエストの応答に、ステータスコード(例: HTTP/1.1 200 OK)やContent-TypeなどのHTTPヘッダー情報を含めるように指示しています。この設定がなければ、レスポンスにはボディ(Webページの本文など)のみが含まれます。
具体的な処理の流れとしては、まずcurl_init()でcURLセッションを開始し、curl_setopt()でリクエストURL、結果を文字列として受け取る設定(CURLOPT_RETURNTRANSFER)、そして重要なCURLOPT_HEADERをtrueに設定します。次にcurl_exec()で実際にリクエストを実行し、取得したレスポンスデータからcurl_getinfo()でヘッダーのサイズを取得し、ヘッダーとボディを分離してそれぞれ画面に出力しています。最後にcurl_close()でセッションを終了し、リソースを解放します。
fetchUrlWithHeaders関数は、リクエスト先のURLを文字列型(string)で引数として受け取り、特に値を返すことはありません(void)。このコードは、Webページの内容だけでなく、通信の詳細な情報であるヘッダーも確認したい場合に非常に役立ちます。
CURLOPT_HEADERをtrueに設定すると、HTTPレスポンス全体にヘッダーとボディの両方が含まれます。そのため、レスポンスボディのみを扱いたい場合は、取得したデータからヘッダー部分を適切に分離する処理が必要不可欠です。この分離には、curl_getinfo()で得られるCURLINFO_HEADER_SIZEを使うのが確実な方法です。また、curl_init()やcurl_exec()の実行が失敗する可能性を考慮し、必ずエラーチェックとエラーメッセージの表示を行うようにしてください。セッション終了時には、リソース解放のためcurl_close()を忘れずに実行することが、安全なプログラミングの基本です。