Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】CURLINFO_HTTP_VERSION定数の使い方

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

作成日: 更新日:

基本的な使い方

CURLINFO_HTTP_VERSION定数は、PHPのcURL拡張機能において、実行されたcURL転送で実際に使用されたHTTPプロトコルのバージョン情報を取得するために用いられる定数です。この定数をcurl_getinfo()関数に引数として渡すことで、直前に行われたHTTPリクエストがどのプロトコルバージョン(例えばHTTP/1.0、HTTP/1.1、HTTP/2、HTTP/3など)で処理されたかを確認できます。

返される値は整数であり、具体的なHTTPバージョンを表します。例えば、HTTP/1.0が使用された場合はCURL_HTTP_VERSION_1_0、HTTP/1.1が使用された場合はCURL_HTTP_VERSION_1_1、HTTP/2が使用された場合はCURL_HTTP_VERSION_2_0、HTTP/3(QUIC)が使用された場合はCURL_HTTP_VERSION_3といったcURLライブラリが定義する定数に対応する値が返されます。これにより、開発者は自身のアプリケーションが外部のウェブサーバーとどのようなプロトコルで通信しているかを正確に把握することができます。

この情報は、特にウェブサービスとの連携において、デバッグやパフォーマンスチューニングを行う際に非常に有用です。例えば、期待通りにHTTP/2が使用されているかを確認したり、古いHTTPバージョンでの通信が問題を引き起こしていないかを検証したりするのに役立ちます。PHPのcURL拡張機能は、ウェブアプリケーションが外部リソースと対話するための基盤であり、CURLINFO_HTTP_VERSION定数のような詳細情報へのアクセスは、より堅牢で効率的なアプリケーション開発に貢献します。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_URL, "http://example.com");
4curl_exec($ch);
5$http_version_info = curl_getinfo($ch, CURLINFO_HTTP_VERSION);
6curl_close($ch);
7?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURLでHTTPバージョンとステータスコードを取得する

1<?php
2
3/**
4 * 指定されたURLへのHTTPリクエストを行い、HTTPプロトコルバージョンとHTTPステータスコードを取得します。
5 *
6 * この関数は、PHPのcURL拡張機能を使用してウェブサーバーと通信し、
7 * 通信に使用されたHTTPプロトコルバージョンと、リクエスト結果のHTTPステータスコード(例: 200 OK, 404 Not Found)
8 * の情報を取得します。
9 *
10 * @param string $url リクエストを送信するターゲットURL。
11 * @return array|false 成功した場合はHTTPバージョンとステータスコードを含む連想配列を返します。
12 *                     キーは 'http_version_string' (判読可能な文字列)、'http_status_code' (数値) です。
13 *                     cURLエラーが発生した場合は false を返します。
14 */
15function getCurlHttpInfo(string $url): array|false
16{
17    // cURLセッションを初期化します。これにより、HTTPリクエストの準備が始まります。
18    $ch = curl_init();
19
20    // cURLオプションを設定します。
21    // リクエストを送信するURLを設定します。
22    curl_setopt($ch, CURLOPT_URL, $url);
23    // 転送結果(レスポンスボディ)を直接出力せず、関数の戻り値として文字列で取得するように設定します。
24    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
25    // レスポンスヘッダを含めないように設定します。ボディのみが必要な場合に使います。
26    curl_setopt($ch, CURLOPT_HEADER, false);
27
28    // HTTPリクエストを実行し、結果を$responseに格納します。
29    $response = curl_exec($ch);
30
31    // cURLの実行中にエラーが発生したかチェックします。
32    if (curl_errno($ch)) {
33        // エラーメッセージを出力し、セッションを閉じてfalseを返します。
34        echo 'cURLエラー: ' . curl_error($ch) . "\n";
35        curl_close($ch);
36        return false;
37    }
38
39    // HTTPプロトコルバージョンを取得します。CURLINFO_HTTP_VERSIONは、
40    // 使用されたHTTPプロトコル(例: HTTP/1.1, HTTP/2)を示すコードを返します。
41    $httpVersionCode = curl_getinfo($ch, CURLINFO_HTTP_VERSION);
42
43    // HTTPステータスコードを取得します。CURLINFO_HTTP_CODEは、
44    // リクエストの結果(例: 200 OK, 404 Not Found)を示す数値を返します。
45    $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
46
47    // cURLセッションを閉じます。これにより、リソースが解放されます。
48    curl_close($ch);
49
50    // 取得したHTTPプロトコルバージョンコードを、人間が理解しやすい文字列に変換します。
51    // PHP 8以降で利用可能な match 式を使用しています。
52    $httpVersionString = match ($httpVersionCode) {
53        CURL_HTTP_VERSION_NONE => '不明 (NONE)',
54        CURL_HTTP_VERSION_1_0 => 'HTTP/1.0',
55        CURL_HTTP_VERSION_1_1 => 'HTTP/1.1',
56        CURL_HTTP_VERSION_2_0 => 'HTTP/2.0', // CURL_HTTP_VERSION_2_HTTP2 と同じ値
57        CURL_HTTP_VERSION_2_TLS => 'HTTP/2 (TLS)',
58        CURL_HTTP_VERSION_3 => 'HTTP/3',
59        default => "不明なバージョンコード ({$httpVersionCode})", // 未知のコードの場合
60    };
61
62    // 取得した情報を連想配列として返します。
63    return [
64        'http_version_string' => $httpVersionString,
65        'http_status_code' => $httpStatusCode,
66    ];
67}
68
69// --- サンプルコードの実行例 ---
70
71// Googleのホームページを対象に情報を取得してみます。
72$targetUrl = 'https://www.google.com/';
73$info = getCurlHttpInfo($targetUrl);
74
75if ($info) {
76    echo "--- 正常なURLの情報 ---\n";
77    echo "URL: {$targetUrl}\n";
78    echo "HTTPプロトコルバージョン: {$info['http_version_string']}\n";
79    echo "HTTPステータスコード: {$info['http_status_code']}\n";
80} else {
81    echo "cURL情報の取得に失敗しました。\n";
82}
83
84echo "\n"; // 出力を見やすくするための改行
85
86// 存在しないURLを対象に情報を取得してみます(404 Not Found エラーが期待されます)。
87$nonExistentUrl = 'https://example.com/non-existent-page-12345';
88$nonExistentInfo = getCurlHttpInfo($nonExistentUrl);
89
90if ($nonExistentInfo) {
91    echo "--- 存在しないURLの情報 ---\n";
92    echo "URL: {$nonExistentUrl}\n";
93    echo "HTTPプロトコルバージョン: {$nonExistentInfo['http_version_string']}\n";
94    echo "HTTPステータスコード: {$nonExistentInfo['http_status_code']}\n";
95} else {
96    echo "cURL情報の取得に失敗しました。\n";
97}

このPHPサンプルコードは、指定されたURLにHTTPリクエストを送信し、その通信で使われたHTTPプロトコルバージョンとHTTPステータスコードを取得する方法を示しています。まず、curl_init()でcURLセッションを開始し、curl_setopt()でターゲットURLや、転送結果を文字列で取得する設定などを行います。

curl_exec()で実際にリクエストを実行した後、curl_errno()でエラーがないかを確認します。情報取得の核心はcurl_getinfo()関数です。この関数にCURLINFO_HTTP_VERSIONを渡すと、通信に使用されたHTTPプロトコル(例えばHTTP/1.1やHTTP/2.0など)を示す数値コードが得られます。また、CURLINFO_HTTP_CODEを渡すと、リクエスト結果のHTTPステータスコード(例えば「200 OK」を示す200や、「404 Not Found」を示す404)が得られます。取得したHTTPバージョンコードは、PHP 8で導入されたmatch式を使って人間が読める文字列に変換されます。

この関数は、引数としてリクエストを送る$url(文字列)を受け取ります。処理が成功すると、HTTPバージョンが文字列化された'http_version_string'とHTTPステータスコードの'http_status_code'をキーに持つ連想配列を返します。もしcURLの実行中にエラーが発生した場合は、falseを戻り値として返します。最後にcurl_close()でcURLセッションを終了し、リソースを解放しています。

このコードでは、cURLセッション開始のcurl_init()と終了のcurl_close()はセットで利用し、エラー発生時も含め必ずリソースを解放してください。curl_exec()実行後はcurl_errno()でエラーの有無を必ず確認し、適切に処理することが重要です。curl_getinfo()で取得するCURLINFO_HTTP_VERSIONはHTTPプロトコルのバージョンを示す数値コードであり、サンプルコードのように人間が読める文字列への変換が必要です。CURLINFO_HTTP_CODEはHTTPステータスコードの数値で、200が成功、404がページなし、といったサーバーの応答状況を表します。これらのコードの意味を理解することが、ウェブ通信の状態を正確に把握するために不可欠です。また、バージョン変換に用いているmatch式はPHP 8以降の機能であることをご留意ください。

PHP cURLでHTTPバージョンを取得する

1<?php
2
3/**
4 * cURL 拡張機能を使用して指定されたURLのHTTPバージョン情報を取得し、表示します。
5 * cURL が有効でない場合は、その旨を通知し、phpinfo() で確認するよう促します。
6 *
7 * @return void
8 */
9function displayCurlHttpVersionInfo(): void
10{
11    // cURL 拡張機能がロードされているか確認します。
12    // ロードされていない場合、phpinfo() を確認するよう促します。
13    if (!extension_loaded('curl')) {
14        echo "エラー: cURL 拡張機能が有効ではありません。\n";
15        echo "システムの設定(php.ini)を確認するか、`phpinfo()` 関数を実行して拡張機能のロード状況を確認してください。\n";
16        return;
17    }
18
19    echo "cURL 拡張機能は有効です。\n\n";
20
21    // テスト対象のURLを設定します。
22    $url = 'https://www.example.com'; 
23    echo "{$url} へのcURLリクエスト情報を取得します。\n";
24
25    // cURL セッションを初期化します。
26    $ch = curl_init();
27
28    // cURL セッションの初期化に失敗した場合の処理
29    if ($ch === false) {
30        echo "エラー: cURL セッションの初期化に失敗しました。\n";
31        return;
32    }
33
34    // cURL オプションを設定します。
35    curl_setopt($ch, CURLOPT_URL, $url);                 // リクエスト先のURL
36    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);       // 転送結果を文字列で返すように設定
37
38    // cURL リクエストを実行します。
39    $response = curl_exec($ch);
40
41    // cURL リクエスト中にエラーが発生した場合の処理
42    if (curl_errno($ch)) {
43        echo "cURL エラー (" . curl_errno($ch) . "): " . curl_error($ch) . "\n";
44    } else {
45        echo "cURL リクエストが成功しました。\n\n";
46
47        // CURLINFO_HTTP_VERSION 定数を使用して、使用されたHTTPバージョンを取得します。
48        // curl_getinfo() は、指定された定数に対応する情報(ここではHTTPバージョン)を返します。
49        $httpVersion = curl_getinfo($ch, CURLINFO_HTTP_VERSION);
50        $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
51        $totalTime = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
52
53        echo "取得したcURL情報:\n";
54        echo "- HTTP ステータスコード: " . $httpStatusCode . "\n";
55        echo "- HTTP バージョン (CURLINFO_HTTP_VERSION): ";
56
57        // 取得したHTTPバージョン(数値)を、より分かりやすい文字列に変換して表示します。
58        switch ($httpVersion) {
59            case CURL_HTTP_VERSION_NONE:
60                echo "自動 (デフォルト)";
61                break;
62            case CURL_HTTP_VERSION_1_0:
63                echo "HTTP/1.0";
64                break;
65            case CURL_HTTP_VERSION_1_1:
66                echo "HTTP/1.1";
67                break;
68            case CURL_HTTP_VERSION_2_0:
69                echo "HTTP/2.0";
70                break;
71            case CURL_HTTP_VERSION_3:
72                echo "HTTP/3";
73                break;
74            default:
75                echo "不明なバージョン ({$httpVersion})";
76                break;
77        }
78        echo "\n";
79        echo "- 転送にかかった合計時間: " . round($totalTime, 2) . " 秒\n";
80    }
81
82    // cURL セッションを閉じ、リソースを解放します。
83    curl_close($ch);
84}
85
86// 関数を実行します。
87displayCurlHttpVersionInfo();
88
89?>

このPHPコードは、cURL拡張機能を使用して、指定されたURLへのHTTPリクエストで実際に利用されたHTTPプロトコルバージョン情報を取得し、システムエンジニアを目指す初心者にも分かりやすく表示する方法を示しています。

まず、extension_loaded('curl')関数でcURL拡張機能がサーバーにロードされているかを確認します。もし有効でない場合は、その旨を通知し、phpinfo()関数で拡張機能の状態を確認するよう促します。これは、PHPで外部サービスと通信する際に重要な前提条件です。

cURL拡張機能が有効な場合、curl_init()でcURLセッションを開始し、curl_setopt()で対象URLなどのリクエストオプションを設定します。その後、curl_exec()でHTTPリクエストを実行し、サーバーからの応答を試みます。

リクエストが成功すると、curl_getinfo()関数にCURLINFO_HTTP_VERSION定数を第二引数として渡すことで、実際に使用されたHTTPプロトコルのバージョン番号を取得できます。CURLINFO_HTTP_VERSION定数自体は引数を取りませんが、この定数を用いることで、curl_getinfo()は対応するHTTPバージョンの数値(例: CURL_HTTP_VERSION_1_1)を返します。コードでは、この数値をswitch文でHTTP/1.1やHTTP/2.0といった分かりやすい文字列に変換して表示しています。また、HTTPステータスコードや転送時間などの関連情報も同時に取得・表示し、最終的にcurl_close()でセッションを閉じ、リソースを解放します。

このコードはPHPのcURL拡張機能を利用するため、事前にPHPの設定ファイル(php.ini)でcURL拡張機能が有効になっているか確認が必要です。有効でない場合、エラーが発生し、コードは期待通りに動作しませんのでご注意ください。有効化の確認には、サンプルコード内にもあるphpinfo()関数が役立ちます。CURLINFO_HTTP_VERSIONは、curl_getinfo()関数を使ってcURLリクエストの実行後に、実際に使用されたHTTPのバージョン番号を取得するための定数です。この定数から直接値は取得できず、curl_getinfo()関数の第二引数として利用することで数値を取得できます。取得した数値は、CURL_HTTP_VERSION_1_1のような別の定数と比較して、どのHTTPバージョンが使われたかを判断することになります。ネットワーク通信を伴うため、URLの指定ミスや通信エラーの可能性も考慮し、適切なエラーハンドリングを実装することが重要です。また、curl_init()で開始したcURLセッションは、必ずcurl_close()で終了し、リソースを解放するようにしてください。

関連コンテンツ

関連IT用語

関連プログラミング言語