【PHP8.x】CURLINFO_PROTOCOL定数の使い方
CURLINFO_PROTOCOL定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_PROTOCOL定数は、PHPのcURL拡張機能において、ネットワーク経由でのファイル転送やデータ通信が最終的にどのプロトコルを使用して行われたかを示す情報を取得するために利用される定数です。この定数は、主にcurl_getinfo()関数に引数として渡すことで、指定されたcURLセッションが実際に使用したプロトコルに関する詳細な情報を取得する目的で用いられます。
取得される値は、HTTP、HTTPS、FTP、FTPS、SFTPなど、多数存在するネットワークプロトコルのうち、実際に使用されたものをビットフラグとして表す整数値(ビットフィールド)です。そのため、特定のプロトコルが使用されたかどうかを確認するには、取得した値とCURLPROTO_*形式の他の定数(例: CURLPROTO_HTTP, CURLPROTO_HTTPS)との間でビット論理積(&)演算を行う必要があります。
例えば、ウェブサイトへのアクセスで安全なHTTPSプロトコルを使用しているかを確認したい場合、CURLINFO_PROTOCOLで取得した情報とCURLPROTO_HTTPS定数を比較することで、その状況を正確に把握できます。この機能は、通信のセキュリティ状態の検証、デバッグ情報の収集、あるいはアプリケーションが通信プロトコルに応じて異なる処理を行う必要のある場面で非常に役立ち、堅牢で信頼性の高いシステムを構築するための重要なツールとなります。
構文(syntax)
1<?php 2$ch = curl_init("http://example.com"); 3curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 4curl_exec($ch); 5$protocol_id = curl_getinfo($ch, CURLINFO_PROTOCOL); 6curl_close($ch); 7?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP CURLでプロトコルとHTTPコードを取得する
1<?php 2 3/** 4 * 指定されたURLに対してHTTPリクエストを実行し、 5 * 使用されたプロトコル情報とHTTPステータスコードを取得して表示します。 6 * 7 * システムエンジニアを目指す初心者向けに、curl_init(), curl_setopt(), curl_exec(), 8 * curl_getinfo(), curl_close() といったCURLの基本的な関数群の使用方法、 9 * および CURLINFO_PROTOCOL と CURLINFO_HTTP_CODE 定数を利用して 10 * HTTP通信の情報を取得する方法を示します。 11 * 12 * @param string $url リクエストを送信するターゲットURL。 13 * @return void 14 */ 15function getCurlRequestInfo(string $url): void 16{ 17 // 1. CURLセッションを初期化します。 18 // curl_init() は新しいCURLセッションを初期化し、CURLハンドルを返します。 19 $ch = curl_init(); 20 21 // 初期化に失敗した場合はエラーメッセージを表示して終了します。 22 if ($ch === false) { 23 echo "CURLセッションの初期化に失敗しました。PHPのCURL拡張機能が有効になっているか確認してください。" . PHP_EOL; 24 return; 25 } 26 27 // 2. CURLオプションを設定します。 28 // curl_setopt() を使用して、CURLリクエストの動作を細かく制御します。 29 30 // リクエスト先のURLを設定します。 31 curl_setopt($ch, CURLOPT_URL, $url); 32 33 // リクエストの実行結果(レスポンスボディ)を文字列として返すように設定します。 34 // これを true にしない場合、curl_exec() は直接結果を出力します。 35 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 36 37 // リダイレクトが発生した場合に、自動的に新しいロケーションに追従するように設定します。 38 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 39 40 // 自動的に追従するリダイレクトの最大数を設定し、無限ループを防ぎます。 41 curl_setopt($ch, CURLOPT_MAXREDIRS, 10); 42 43 // リクエストのタイムアウトを秒単位で設定します。 44 // 指定した秒数以内にレスポンスがない場合、リクエストは中断されます。 45 curl_setopt($ch, CURLOPT_TIMEOUT, 30); 46 47 // 3. CURLリクエストを実行します。 48 // curl_exec() はCURLセッションを実行し、設定に応じた結果を返します。 49 // CURLOPT_RETURNTRANSFER が true の場合、レスポンスボディを文字列として返します。 50 // 失敗した場合は false を返します。 51 $response = curl_exec($ch); 52 53 // 4. エラーハンドリングと情報の取得を行います。 54 // curl_errno() は直近のCURL操作のエラー番号を返します。エラーがない場合は 0 を返します。 55 if (curl_errno($ch)) { 56 // エラーが発生した場合、curl_error() でエラーメッセージを取得し表示します。 57 echo "CURLエラーが発生しました: " . curl_error($ch) . PHP_EOL; 58 } else { 59 // curl_getinfo() を使用して、CURLリクエストに関する詳細情報を取得します。 60 61 // リクエストに使用されたプロトコル情報を取得します。 62 // CURLINFO_PROTOCOL は整数値を返します。この値はPHPのCURL_PROTOCOL_*定数に対応します。 63 // 例: 1 (HTTP/1.x), 2 (HTTPS), 6 (HTTP/2), 7 (HTTP/3) など。 64 $protocol = curl_getinfo($ch, CURLINFO_PROTOCOL); 65 66 // サーバーから返されたHTTPステータスコードを取得します。 67 // 例: 200 (OK), 404 (Not Found), 500 (Internal Server Error) など。 68 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 69 70 // 取得した情報を出力します。 71 echo "--- CURL リクエスト情報 ---" . PHP_EOL; 72 echo "ターゲットURL: " . $url . PHP_EOL; 73 echo "使用されたプロトコル (CURLINFO_PROTOCOL): " . $protocol . PHP_EOL; 74 echo "HTTPステータスコード (CURLINFO_HTTP_CODE): " . $httpCode . PHP_EOL; 75 echo "--------------------------" . PHP_EOL; 76 } 77 78 // 5. CURLセッションを閉じます。 79 // curl_close() はCURLセッションを終了し、使用されたリソースを解放します。 80 curl_close($ch); 81} 82 83// 関数の実行例 84// 実際のウェブサイトに対してリクエストを行い、情報を表示します。 85// これらの実行にはネットワーク接続が必要です。 86 87// 正常なHTTP/HTTPSリクエストの例 (通常200 OKが返されます) 88getCurlRequestInfo('https://www.google.com'); 89 90echo PHP_EOL; // 出力を見やすくするための改行 91 92// 存在しないページへのリクエストの例 (通常404 Not Foundが返されます) 93getCurlRequestInfo('https://httpbin.org/status/404'); 94 95echo PHP_EOL; // 出力を見やすくするための改行 96 97// 別のURLでのプロトコルやステータスコードの確認 98getCurlRequestInfo('http://example.com'); 99
このPHPサンプルコードは、指定されたURLに対してHTTPリクエストを実行し、その通信に関する重要な情報を取得・表示する方法を、システムエンジニアを目指す初心者向けに解説しています。
まず、curl_init()関数で新しいCURLセッションを開始し、リクエストの準備をします。この関数はCURLセッションを表すハンドルを戻り値として返します。次に、curl_setopt()関数を用いて、アクセスするURL(CURLOPT_URL)や、レスポンスを直接出力せずに文字列として受け取る設定(CURLOPT_RETURNTRANSFER)、リダイレクトに自動で追従する設定(CURLOPT_FOLLOWLOCATION)など、リクエストの振る舞いを細かく指定します。これらの設定は、成功時にtrueを、失敗時にfalseを戻り値として返します。
設定が完了したら、curl_exec()関数で実際にHTTPリクエストを実行します。この関数は、CURLOPT_RETURNTRANSFERがtrueの場合にレスポンスボディを文字列として返し、失敗した場合はfalseを返します。リクエストの実行後、curl_getinfo()関数を使って詳細な情報を取得します。ここで、CURLINFO_PROTOCOL定数を利用すると、HTTP/1.1やHTTPSなど、実際に使用されたプロトコルの種類を数値として得ることができます。また、CURLINFO_HTTP_CODE定数を使うことで、サーバーから返されたHTTPステータスコード(例:200 OK, 404 Not Foundなど)を取得できます。curl_getinfo()は、指定された情報に対応する値を戻り値として返します。
最後に、curl_close()関数を呼び出すことで、使用したCURLセッションのリソースを解放します。この関数は成功時にtrueを、失敗時にfalseを返します。この一連の処理を通じて、PHPで外部のウェブサービスと連携するための基本的なCURL操作を学ぶことができます。
このコードを実行するには、PHPでCURL拡張機能が有効になっていることを確認してください。CURLINFO_PROTOCOLが返す値は、どのプロトコルが使用されたかを示す整数値です。これらの具体的な意味は、PHPの公式ドキュメントでCURL_PROTOCOL_*定数として確認できますので、必要に応じて調べてみてください。また、ネットワーク接続がないとリクエストは失敗します。curl_setopt()で設定するタイムアウトやリダイレクト追従などのオプションは、通信の安全性や安定性に直結しますので、用途に合わせて適切に設定することが重要です。通信エラーの確認と、使用したリソースを確実に解放するcurl_close()の呼び出しは、プログラムの安定運用に欠かせない点です。
PHP cURLでプロトコル情報を取得する
1<?php 2 3/** 4 * 指定されたURLへのcURLリクエストを実行し、使用されたプロトコル情報を表示します。 5 * 6 * この関数は、システムエンジニアを目指す初心者向けに、CURLINFO_PROTOCOL定数の使い方を 7 * 理解しやすくするために作成されています。 8 * 9 * @param string $url リクエストを送信するURL。 10 */ 11function getCurlProtocolInfo(string $url): void 12{ 13 // cURLセッションを初期化します。 14 // curl_init() は新しいcURLセッションを開始し、ハンドルを返します。 15 $ch = curl_init(); 16 17 // cURLオプションを設定します。 18 // CURLOPT_URL はリクエストを送信するURLを設定します。 19 curl_setopt($ch, CURLOPT_URL, $url); 20 21 // cURLリクエストを実行します。 22 // curl_exec() はcURLセッションを実行します。成功するとtrueを返し、失敗するとfalseを返します。 23 // 戻り値は通常、CURLOPT_RETURNTRANSFER が設定されていない場合、直接出力されます。 24 // ここでは応答自体は不要なため、そのまま実行します。 25 $response = curl_exec($ch); 26 27 // cURLリクエスト中にエラーが発生したか確認します。 28 if (curl_errno($ch)) { 29 // エラーが発生した場合、エラーメッセージを表示します。 30 echo 'cURLエラー: ' . curl_error($ch) . PHP_EOL; 31 } else { 32 // CURLINFO_PROTOCOL 定数を使用して、実際に使用されたプロトコルの情報を取得します。 33 // curl_getinfo() はcURL転送に関する情報を取得するために使用されます。 34 // CURLINFO_PROTOCOL は、プロトコルを示す整数値を返します(例: CURLPROTO_HTTP, CURLPROTO_HTTPS)。 35 $protocol = curl_getinfo($ch, CURLINFO_PROTOCOL); 36 37 echo "--- URL: {$url} ---" . PHP_EOL; 38 echo "使用されたプロトコル (CURLINFO_PROTOCOL): {$protocol}" . PHP_EOL; 39 40 // 取得したプロトコル値が何を意味するのかを、より分かりやすい文字列に変換して表示します。 41 // PHP 8 の match 式を使用しています。 42 $protocolName = match ($protocol) { 43 CURLPROTO_HTTP => 'HTTP (Hypertext Transfer Protocol)', 44 CURLPROTO_HTTPS => 'HTTPS (Hypertext Transfer Protocol Secure)', 45 CURLPROTO_FTP => 'FTP (File Transfer Protocol)', 46 CURLPROTO_FTPS => 'FTPS (FTP Secure)', 47 CURLPROTO_SMB => 'SMB (Server Message Block)', 48 CURLPROTO_SMBS => 'SMBS (SMB Secure)', 49 CURLPROTO_POP3 => 'POP3 (Post Office Protocol version 3)', 50 CURLPROTO_POP3S => 'POP3S (POP3 Secure)', 51 CURLPROTO_IMAP => 'IMAP (Internet Message Access Protocol)', 52 CURLPROTO_IMAPS => 'IMAPS (IMAP Secure)', 53 CURLPROTO_SMTP => 'SMTP (Simple Mail Transfer Protocol)', 54 CURLPROTO_SMTPS => 'SMTPS (SMTP Secure)', 55 CURLPROTO_LDAP => 'LDAP (Lightweight Directory Access Protocol)', 56 CURLPROTO_LDAPS => 'LDAPS (LDAP Secure)', 57 CURLPROTO_RTMP => 'RTMP (Real-Time Messaging Protocol)', 58 CURLPROTO_RTMPE => 'RTMPE (RTMP Encrypted)', 59 CURLPROTO_RTMPS => 'RTMPS (RTMP Secure)', 60 CURLPROTO_RTMPT => 'RTMPT (RTMP Tunneled)', 61 CURLPROTO_RTMPTE => 'RTMPTE (RTMP Tunneled Encrypted)', 62 CURLPROTO_RTMPTS => 'RTMPTS (RTMP Tunneled Secure)', 63 CURLPROTO_RTSP => 'RTSP (Real Time Streaming Protocol)', 64 CURLPROTO_DICT => 'DICT (Dictionary Protocol)', 65 CURLPROTO_TELNET => 'TELNET (Telecommunication Network)', 66 CURLPROTO_GOPHER => 'GOPHER (Gopher Protocol)', 67 CURLPROTO_FILE => 'FILE (Local File Access)', 68 CURLPROTO_SCP => 'SCP (Secure Copy Protocol)', 69 CURLPROTO_SFTP => 'SFTP (SSH File Transfer Protocol)', 70 default => '不明なプロトコル (' . $protocol . ')', // 定義されていないプロトコルの場合 71 }; 72 echo "プロトコル名: {$protocolName}" . PHP_EOL; 73 } 74 75 // cURLセッションを閉じます。 76 // curl_close() はcURLセッションを終了し、リソースを解放します。 77 curl_close($ch); 78 echo PHP_EOL; // 出力の区切り 79} 80 81// サンプルとして、一般的なウェブサイト (HTTPS) のプロトコル情報を取得します。 82getCurlProtocolInfo("https://www.google.com"); 83 84// HTTP プロトコルを使用するウェブサイトの例です。 85// (ただし、多くのサイトはHTTPアクセスをHTTPSにリダイレクトする可能性があります) 86getCurlProtocolInfo("http://www.example.com"); 87 88?>
このPHPサンプルコードは、CURLINFO_PROTOCOL定数を用いて、指定されたURLへのcURLリクエストで実際に使用されたプロトコルの情報を取得し表示する方法を示しています。まず、curl_init()関数で新しいcURLセッションを開始し、curl_setopt()でアクセス先のURLを設定します。curl_exec()でcURLリクエストを実行した後、curl_getinfo()関数とCURLINFO_PROTOCOL定数を使って、通信で使われたプロトコルを数値として取得します。CURLINFO_PROTOCOL自体は引数も戻り値もありませんが、curl_getinfo()関数の第二引数として指定することで、cURLセッションが使用したプロトコルを示す整数値を得られます。取得される値は、例えばHTTPならCURLPROTO_HTTP、HTTPSならCURLPROTO_HTTPSといった、各プロトコルに対応する整数値です。サンプルコードでは、PHP 8のmatch式を用いて、この整数値を「HTTP」や「HTTPS」といった分かりやすいプロトコル名に変換して出力しています。最後にcurl_close()でセッションを閉じます。このコードは、ウェブサイトへのアクセスでどのプロトコルが使われたかを初心者でも確認できる、cURLとプロトコル情報取得の基本を学ぶための良い例です。
PHPでcURLを利用する際は、まずcURL拡張がPHPにインストールされ、php.iniで有効になっていることを確認してください。cURLセッションはcurl_init()で開始した後、処理の最後に必ずcurl_close()で閉じ、リソースを適切に解放することが重要です。これを怠るとメモリなどのリソースが消費され続ける原因となります。CURLINFO_PROTOCOLは、実際にデータ転送に利用されたプロトコルを数値で返します。サンプルコードのようにCURLPROTO_*定数と比較することで、その数値がどのプロトコル(例:HTTP, HTTPS)を指すのかを理解できます。また、指定したURLがHTTPからHTTPSへリダイレクトされる場合、この定数はリダイレクト後の最終的なプロトコルを返します。エラー発生時にはcurl_errno()とcurl_error()で必ず確認し、適切なエラーハンドリングを行う習慣をつけましょう。