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

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

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

作成日: 更新日:

基本的な使い方

CURLINFO_SCHEME定数は、PHPのcURL拡張機能において、実行された通信のURLスキーム、すなわちプロトコルの種類を表す定数です。

この定数は、curl_getinfo()関数と組み合わせて使用されます。curl_getinfo()関数は、cURLセッションに関する様々な情報を取得するために用いられる重要な関数です。具体的には、curl_getinfo($ch, CURLINFO_SCHEME)のように記述することで、指定されたcURLハンドル$chで実行された通信が、どのようなプロトコル(通信規約)を使用しているかを文字列として取得できます。

例えば、ウェブサイトへのリクエストが「https://www.example.com」であった場合、この定数を使用すると「https」という文字列が得られます。同様に、「http://www.example.com」であれば「http」が、「ftp://www.example.com」であれば「ftp」といった値が返されます。

システム開発において、外部のウェブサービスと連携したり、ファイルを転送したりする際、実際にどのプロトコルが使用されたかを確認することは重要です。この情報を使って、通信の安全性をチェックしたり、特定のプロトコルに応じた処理の分岐を行ったりすることが可能になります。CURLINFO_SCHEME定数は、通信の詳細情報をプログラムで扱う上で役立つ、基本的ながらも重要な情報源の一つです。

構文(syntax)

1<?php
2$ch = curl_init();
3curl_setopt($ch, CURLOPT_URL, "https://example.com");
4curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
5curl_exec($ch);
6
7$scheme = curl_getinfo($ch, CURLINFO_SCHEME);
8
9curl_close($ch);

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

CURLINFO_SCHEMEは、cURL通信で使用されたプロトコルのスキーマを示す整数値を返します。例えば、HTTP通信であれば「http」、HTTPS通信であれば「https」に対応する値が返されます。

サンプルコード

PHP curl_infoでURLスキームを取得する

1<?php
2
3/**
4 * 指定されたURLのスキーム情報をCURLINFO_SCHEMEを使用して取得し、表示します。
5 *
6 * この関数は、システムエンジニアを目指す初心者向けに、cURL拡張機能と
7 * CURLINFO_SCHEME定数の基本的な使い方を簡潔に示します。
8 *
9 * @param string $url スキーム情報を取得したいURL
10 * @return void
11 */
12function demonstrateCurlInfoScheme(string $url): void
13{
14    // cURLセッションを初期化します。
15    // ネットワークリクエストを行うための準備です。
16    $ch = curl_init();
17
18    // 初期化に失敗した場合はエラーメッセージを表示して終了します。
19    if ($ch === false) {
20        echo "エラー: cURLセッションの初期化に失敗しました。\n";
21        return;
22    }
23
24    // cURLオプションを設定します。
25    // CURLOPT_URL: リクエストのターゲットURLを指定します。
26    curl_setopt($ch, CURLOPT_URL, $url);
27    // CURLOPT_RETURNTRANSFER: curl_exec() が実行結果を文字列で返すようにします。
28    // trueに設定しない場合、結果は直接出力されます。
29    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
30    // CURLOPT_NOBODY: レスポンスボディを取得せず、ヘッダー情報のみを取得するようにします。
31    // スキーム情報取得にはボディは不要なため、効率化のために設定します。
32    curl_setopt($ch, CURLOPT_NOBODY, true);
33
34    echo "指定されたURL: " . $url . "\n";
35    echo "cURLリクエストを実行中...\n";
36
37    // cURLリクエストを実行します。
38    // CURLOPT_NOBODYがtrueなので、$responseには空文字列が格納されます。
39    curl_exec($ch);
40
41    // リクエスト中にエラーが発生したかチェックします。
42    if (curl_errno($ch)) {
43        echo "エラー: cURLリクエスト中に問題が発生しました。\n";
44        echo "エラーコード: " . curl_errno($ch) . ", エラーメッセージ: " . curl_error($ch) . "\n";
45        // エラーが発生した場合は、リソースを閉じて終了します。
46        curl_close($ch);
47        return;
48    }
49
50    echo "cURLリクエストが正常に完了しました。\n";
51
52    // curl_getinfo() を使用して、CURLINFO_SCHEMEで指定された情報を取得します。
53    // PHP 8.1以降では、CURLINFO_SCHEMEはURLスキームを示す整数値を返します。
54    $schemeCode = curl_getinfo($ch, CURLINFO_SCHEME);
55
56    echo "CURLINFO_SCHEME が返した値 (整数): " . $schemeCode . "\n";
57
58    // 取得した整数値に対応するスキーム名を特定します。
59    // これらの値はlibcurlのCURLUS_SCHEME_* enumに対応しますが、
60    // PHPにはこれらの定数が直接提供されていないため、ここでは既知の値を直接マッピングしています。
61    $schemeName = match ($schemeCode) {
62        1 => 'HTTP',
63        2 => 'HTTPS',
64        3 => 'FTP',
65        4 => 'FTPS',
66        5 => 'TFTP',
67        6 => 'DICT',
68        7 => 'LDAP',
69        8 => 'LDAPS',
70        9 => 'FILE',
71        10 => 'GOPHER',
72        11 => 'TELNET',
73        12 => 'POP3',
74        13 => 'POP3S',
75        14 => 'IMAP',
76        15 => 'IMAPS',
77        16 => 'SMB',
78        17 => 'SMBS',
79        18 => 'SFTP',
80        19 => 'SCP',
81        20 => 'RTMP',
82        21 => 'RTMPE',
83        22 => 'RTMPS',
84        23 => 'RTMPT',
85        24 => 'RTMPTE',
86        25 => 'RTMPTS',
87        26 => 'RTSP',
88        27 => 'RTSPS',
89        28 => 'MQTT',
90        29 => 'WS',
91        30 => 'WSS',
92        31 => 'HSTS',
93        default => '不明 (' . $schemeCode . ')', // 未知の値の場合はそのまま表示
94    };
95
96    echo "検出されたURLスキーム: " . $schemeName . "\n";
97
98    // cURLセッションを閉じ、リソースを解放します。
99    curl_close($ch);
100}
101
102// サンプルとしてHTTPSのURLで関数を実行します。
103// システムエンジニアを目指す初心者の方も、このコードをPHP環境で実行して結果を確認してみてください。
104$targetUrl = 'https://www.example.com';
105demonstrateCurlInfoScheme($targetUrl);
106
107// 注意: HTTPのスキームを確認したい場合は、以下のコメントアウトを解除し、
108// HTTPアクセスが可能なURLに置き換えて実行してみてください。
109// $targetUrlHttp = 'http://php.net';
110// demonstrateCurlInfoScheme($targetUrlHttp);
111
112?>

PHPのCURLINFO_SCHEMEは、cURL拡張機能を用いてネットワーク通信を行う際、対象となるURLのスキーム(プロトコル)情報を取得するための定数です。curl_getinfo()関数と組み合わせて使用し、例えば指定されたURLがHTTP、HTTPS、FTPのどれを使用しているかといった情報を、対応する整数値で返します。

このサンプルコードでは、まずcurl_init()でcURLセッションを初期化し、curl_setopt()を使ってリクエスト先のURL(CURLOPT_URL)や、レスポンスボディを省略する(CURLOPT_NOBODY)などの設定を行います。設定後、curl_exec()でネットワークリクエストが実行されます。リクエストの成功後、curl_getinfo($ch, CURLINFO_SCHEME)を呼び出すことで、URLのスキームを表す整数値が取得されます。この整数値は、HTTPなら1、HTTPSなら2といったように定義されており、コード内ではmatch式を用いてその値を具体的なスキーム名に変換して表示しています。最後にcurl_close()でセッションを閉じ、使用したリソースを解放します。CURLINFO_SCHEME自体は引数を取りませんが、curl_getinfo()関数の第二引数として利用され、URLスキームを示す整数値が戻り値として返されることで、プログラム内でURLの通信方式を判断する際に役立ちます。

このサンプルコードは、CURLINFO_SCHEMEがURLスキームを直接文字列で返すのではなく、libcurl内部の定義に基づく整数値を返す点に注意が必要です。そのため、取得した整数値をスキーム名に変換する処理が必要となります。このコードを実行するには、お使いのPHP環境でcURL拡張機能が有効になっていることを事前に確認してください。ネットワーク通信を伴う処理では、curl_init()curl_exec()後のエラーハンドリングを徹底することが、プログラムの安定性を確保するために非常に重要です。また、本番環境で外部URLに接続する際には、セキュリティを強化するため、SSL証明書の検証オプション(CURLOPT_SSL_VERIFYPEERなど)を適切に設定するように特に注意してください。CURLOPT_NOBODYを用いることで、スキーム情報のみ取得したい場合に不要なレスポンスボディのダウンロードを回避し、効率を高められます。

PHP cURLでHTTPステータスコードとスキームを取得する

1<?php
2
3/**
4 * 指定されたURLへのcURLリクエストを実行し、
5 * HTTPステータスコードとスキーム情報を取得・表示します。
6 *
7 * この関数は、システムエンジニアを目指す初心者向けに、
8 * PHPのcURL拡張機能を使ってWebリクエストを実行し、
9 * その応答から特定のリクエスト情報を取得する基本的な方法を示します。
10 *
11 * @param string $url リクエストを送信するターゲットURL。
12 * @return void
13 */
14function getCurlRequestInfo(string $url): void
15{
16    // 1. cURLセッションを初期化する
17    // curl_init() は、新しいcURLセッションを作成し、それを操作するためのハンドルを返します。
18    $ch = curl_init();
19
20    // cURLハンドルの初期化に失敗した場合のエラー処理
21    if ($ch === false) {
22        echo "エラー: cURLセッションの初期化に失敗しました。\n";
23        return;
24    }
25
26    // 2. cURLオプションを設定する
27    // curl_setopt() を使用して、cURLセッションの動作をカスタマイズします。
28    
29    // リクエストのターゲットURLを設定します。
30    curl_setopt($ch, CURLOPT_URL, $url);
31
32    // サーバーからの応答を直接出力せず、関数の戻り値として取得するように設定します。
33    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
34
35    // HTTPSリクエストの場合に、SSL証明書の検証をスキップします。
36    // (セキュリティ上の理由から、本番環境では通常はfalseに設定すべきではありません。)
37    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
38    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
39
40    // 3. cURLリクエストを実行する
41    // curl_exec() は、設定されたcURLセッションを実行します。
42    // CURLOPT_RETURNTRANSFER が true の場合、実行結果(レスポンス本文)を文字列として返します。
43    $response = curl_exec($ch);
44
45    // cURLリクエストの実行中にエラーが発生したかチェックします。
46    if ($response === false) {
47        // curl_error() は、直近のcURL操作に関するエラーメッセージを返します。
48        echo "エラー: cURLリクエストの実行中に問題が発生しました: " . curl_error($ch) . "\n";
49    } else {
50        // 4. cURLリクエストから情報を取得する
51        // curl_getinfo() は、cURL操作に関する様々な詳細情報を取得するために使用されます。
52
53        // HTTPステータスコードを取得します。
54        // CURLINFO_HTTP_CODE は、最後のHTTPレスポンスコード(例: 200 OK, 404 Not Found, 500 Internal Server Error)を返します。
55        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
56
57        // 使用されたスキームの数値コードを取得します。
58        // CURLINFO_SCHEME は、リクエストで使用されたプロトコル(例: HTTP, HTTPS)を数値で返します。
59        // これはPHP 8で追加された定数です。
60        // 返される数値はlibcurlの内部的なコードであり、直接 'http' や 'https' という文字列ではありません。
61        $schemeCode = curl_getinfo($ch, CURLINFO_SCHEME);
62        
63        // 5. 取得した情報を表示する
64        echo "ターゲットURL: {$url}\n";
65        echo "取得されたHTTPステータスコード: {$httpCode}\n";
66        echo "取得されたスキームコード: {$schemeCode} (libcurl内部の数値。例: 1=HTTP, 2=HTTPSなど)\n";
67        // 必要に応じて、レスポンス本文の冒頭を表示することもできます。
68        // echo "レスポンスの冒頭:\n" . substr($response, 0, 200) . "...\n";
69    }
70
71    // 6. cURLセッションを閉じる
72    // curl_close() は、cURLセッションを終了し、関連するリソースを解放します。
73    curl_close($ch);
74}
75
76// サンプルとして、既存のWebサイトのURLを使用して関数を呼び出します。
77// 実際に存在するURLを指定してください。
78getCurlRequestInfo("https://www.example.com");
79
80// 別のURLや、異なるHTTPステータスコードが返されるURLで試すこともできます。
81// getCurlRequestInfo("https://httpbin.org/status/404"); // 404 Not Foundの例

このPHPサンプルコードは、cURL拡張機能を利用して、指定されたURLへのWebリクエストを実行し、その応答から重要な情報を取得・表示する基本的な手順を、システムエンジニアを目指す初心者向けに解説しています。

getCurlRequestInfo関数は、引数としてリクエスト先のURLを文字列(string $url)で受け取ります。この関数は情報を表示するだけで、特定の値を返さないため、戻り値はvoidです。

まず、curl_init()でcURLセッションを初期化し、その後curl_setopt()関数を用いて、リクエストのターゲットURLや、レスポンスを直接出力せずに文字列として取得する設定などを細かく指定します。特に、SSL証明書の検証をスキップする設定は、開発環境でのテスト目的で用いられることがありますが、セキュリティの観点から本番環境での利用は推奨されません。

次に、curl_exec()で実際にWebリクエストを実行し、サーバーからの応答を取得します。リクエストの実行中にエラーが発生した場合は、その旨を報告します。成功した場合は、curl_getinfo()関数を使って、実行されたリクエストに関する様々な詳細情報を取得します。

このコードでは、Webサーバーが返したHTTPステータスコードを数値で取得するCURLINFO_HTTP_CODEと、リクエストに使用されたプロトコル(スキーム)の情報を取得するCURLINFO_SCHEMEに焦点を当てています。CURLINFO_SCHEMEはPHP 8で追加された定数で、WebサイトのURLがHTTPかHTTPSかといった情報をlibcurl内部の数値コードとして整数型(int)で返します。

最後に、取得したHTTPステータスコードとスキームコードを表示し、curl_close()でcURLセッションを終了して関連するリソースを解放します。これにより、Webアプリケーションから外部サービスへのデータ取得処理の基本を学ぶことができます。

サンプルコードにおいて、CURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTfalseに設定すると、SSL証明書の検証が無効化され、通信のセキュリティリスクが高まります。本番環境では必ずtrueに設定し、信頼できる証明書を使用してください。CURLINFO_SCHEMEはリクエストのスキーム(プロトコル)を数値で返します。例えば1がHTTP、2がHTTPSなどlibcurl内部の定数値であり、そのまま表示するだけでなく、状況に応じてより分かりやすい文字列に変換すると良いでしょう。また、この定数はPHP 8で追加されたため、古いPHPバージョンでは利用できません。cURLリクエスト実行後は、必ずcurl_close()でリソースを解放し、メモリリークを防ぐことが重要です。エラー発生時にはcurl_error()で詳細を確認し、適切に対処してください。

関連コンテンツ

関連IT用語

関連プログラミング言語