【PHP8.x】CURLINFO_RESPONSE_CODE定数の使い方
CURLINFO_RESPONSE_CODE定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
CURLINFO_RESPONSE_CODE定数は、PHPのcURL拡張機能において、HTTPリクエストを実行した後のサーバーからの応答(レスポンス)のステータスコードを取得するために使用される定数です。cURLは、PHPでHTTPやFTPなど様々なプロトコルを使ってネットワーク通信を行うための強力な機能拡張です。
HTTPステータスコードは、ウェブサーバーがクライアントからのリクエストに対してどのような結果を返したかを示す3桁の数字です。例えば、「200」はリクエストが正常に処理されたことを、「404」は要求されたリソースが見つからなかったことを、「500」はサーバー内部でエラーが発生したことを意味します。これらのコードを解釈することで、通信が成功したか、あるいはどのような種類のエラーが発生したかをプログラムで判断できます。
このCURLINFO_RESPONSE_CODE定数は、curl_getinfo()関数と一緒に使うことで、curl_exec()関数で実行したHTTPリクエストの結果として、実際にサーバーから返されたステータスコードの値を取得できます。これにより、PHPプログラムはHTTPリクエストが成功したのか、それとも何らかの問題が発生したのかを正確に判断し、その結果に応じて適切な後続処理(例えば、成功した場合は取得したデータを処理する、エラーの場合はユーザーにエラーメッセージを表示するなど)を実行できるようになります。システム開発において、外部のウェブサービスとの連携やAPI通信を行う際には、リクエストが期待通りに処理されたかを確認することが非常に重要であり、この定数を用いてレスポンスコードをチェックすることは、堅牢なアプリケーションを構築する上で不可欠な要素です。
構文(syntax)
1<?php 2$ch = curl_init("http://www.example.com"); 3curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 4curl_exec($ch); 5$responseCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); 6curl_close($ch); 7echo $responseCode; 8?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
int
HTTPレスポンスのステータスコードを表す整数を返します。
サンプルコード
PHP cURLでHTTPレスポンスコードを取得する
1<?php 2 3/** 4 * 指定されたURLへのGETリクエストを実行し、そのHTTPレスポンスコードを取得します。 5 * 6 * この関数はPHPのcURL拡張機能を利用してウェブサーバーと通信します。 7 * CURLINFO_RESPONSE_CODE定数を使用し、リクエストの最終的なHTTPステータスコードを返します。 8 * 9 * @param string $url リクエストを送信するURL。 10 * @return int|false HTTPレスポンスコード (例: 200, 404)。cURLエラーが発生した場合はfalse。 11 */ 12function getHttpResponseCode(string $url): int|false 13{ 14 // cURL セッションを初期化します。 15 // これはHTTPリクエストを行うための準備です。 16 $ch = curl_init(); 17 18 // cURL オプションを設定します。 19 // CURLOPT_URL: リクエストを送信するターゲットURLを指定します。 20 curl_setopt($ch, CURLOPT_URL, $url); 21 // CURLOPT_RETURNTRANSFER: curl_exec() がレスポンスを直接出力せず、 22 // 関数が文字列として結果を返すように設定します。 23 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 24 // CURLOPT_FOLLOWLOCATION: サーバーがリダイレクトを指示した場合、 25 // cURLが自動的に新しい場所へ追跡するように設定します。 26 // CURLINFO_RESPONSE_CODEは、リダイレクト後の最終的なレスポンスコードを返します。 27 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 28 // CURLOPT_TIMEOUT: cURL操作の最大実行時間を秒単位で設定します。 29 // 長時間待機するのを避けるため、適切な値を設定することが推奨されます。 30 curl_setopt($ch, CURLOPT_TIMEOUT, 10); 31 32 // cURL リクエストを実行します。 33 // 実際にはレスポンスボディはここでは使用しませんが、リクエストの実行には必要です。 34 curl_exec($ch); 35 36 // cURL リクエスト中にエラーが発生したかを確認します。 37 if (curl_errno($ch)) { 38 // エラーメッセージを出力し、関数はfalseを返して処理を終了します。 39 echo 'cURL エラー: ' . curl_error($ch) . PHP_EOL; 40 curl_close($ch); // エラー発生時もcURLセッションは閉じます。 41 return false; 42 } 43 44 // CURLINFO_RESPONSE_CODE 定数を使用して、HTTPレスポンスコードを取得します。 45 // これは "HTTP/1.1 200 OK" の "200" のようなステータスコードです。 46 $httpResponseCode = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); 47 48 // cURL セッションを閉じ、関連するすべてのリソースを解放します。 49 curl_close($ch); 50 51 // 取得したHTTPレスポンスコードを返します。 52 return $httpResponseCode; 53} 54 55// --- 関数利用の例 --- 56// システムエンジニアを目指す初心者の方でも理解しやすいように、具体的な使用例を示します。 57 58echo "--- HTTP レスポンスコードの取得例 ---" . PHP_EOL . PHP_EOL; 59 60// 1. 正常なリクエストの例 (HTTP 200 OK) 61$urlSuccess = "https://httpbin.org/status/200"; 62echo "URL: " . $urlSuccess . PHP_EOL; 63$codeSuccess = getHttpResponseCode($urlSuccess); 64if ($codeSuccess !== false) { 65 echo " 取得されたHTTPレスポンスコード: " . $codeSuccess . PHP_EOL; // 期待値: 200 66} else { 67 echo " エラー: HTTPレスポンスコードの取得に失敗しました。" . PHP_EOL; 68} 69echo PHP_EOL; 70 71// 2. ページが見つからないリクエストの例 (HTTP 404 Not Found) 72$urlNotFound = "https://httpbin.org/status/404"; 73echo "URL: " . $urlNotFound . PHP_EOL; 74$codeNotFound = getHttpResponseCode($urlNotFound); 75if ($codeNotFound !== false) { 76 echo " 取得されたHTTPレスポンスコード: " . $codeNotFound . PHP_EOL; // 期待値: 404 77} else { 78 echo " エラー: HTTPレスポンスコードの取得に失敗しました。" . PHP_EOL; 79} 80echo PHP_EOL; 81 82// 3. リダイレクトを含むリクエストの例 (最終的に HTTP 200 OK) 83// CURLOPT_FOLLOWLOCATION が true のため、CURLINFO_RESPONSE_CODE は最終的なURLのレスポンスコードを返します。 84$urlRedirect = "https://httpbin.org/redirect-to?url=https://httpbin.org/status/200"; 85echo "URL (リダイレクトあり): " . $urlRedirect . PHP_EOL; 86$codeRedirect = getHttpResponseCode($urlRedirect); 87if ($codeRedirect !== false) { 88 echo " 取得されたHTTPレスポンスコード (リダイレクト後): " . $codeRedirect . PHP_EOL; // 期待値: 200 89} else { 90 echo " エラー: HTTPレスポンスコードの取得に失敗しました。" . PHP_EOL; 91} 92echo PHP_EOL; 93 94// 4. 無効なドメインへのリクエストの例 (cURLエラーが発生するケース) 95$urlInvalid = "https://this-domain-surely-does-not-exist-123456789.com"; 96echo "URL (無効なドメイン): " . $urlInvalid . PHP_EOL; 97$codeInvalid = getHttpResponseCode($urlInvalid); 98if ($codeInvalid !== false) { 99 echo " 取得されたHTTPレスポンスコード: " . $codeInvalid . PHP_EOL; 100} else { 101 echo " エラー: HTTPレスポンスコードの取得に失敗しました (これは意図的なエラーの例です)。" . PHP_EOL; 102} 103 104?>
PHPのCURLINFO_RESPONSE_CODE定数を利用するこのサンプルコードは、指定されたURLへのHTTPリクエストを実行し、そのHTTPレスポンスコードを取得する方法を、システムエンジニアを目指す初心者の方にも分かりやすく示しています。
このコードの中心となるgetHttpResponseCode関数は、引数としてリクエストを送信する$urlを受け取ります。内部では、まずcurl_init()でcURLセッションを初期化し、curl_setopt()で様々なオプションを設定します。CURLOPT_URLでターゲットURLを、CURLOPT_RETURNTRANSFERでcurl_exec()がレスポンス内容を文字列として返すように指定しています。特に、CURLOPT_FOLLOWLOCATIONをtrueに設定することで、リダイレクトがあった場合でもcURLが自動的に最終的なURLへ追跡し、その時点でのレスポンスコードを取得できます。
curl_exec()でHTTPリクエストが実行された後、curl_getinfo()関数とCURLINFO_RESPONSE_CODE定数を用いて、最終的なHTTPステータスコード(例: 200 OK、404 Not Found)を整数値で取得します。このCURLINFO_RESPONSE_CODE定数自体は引数を持ちませんが、curl_getinfo()に渡すことで、HTTPレスポンスのステータスコード(int型)が戻り値として得られます。ネットワークエラーが発生した場合はfalseが戻り値となり、cURLセッションはcurl_close()で閉じられ、リソースが解放されます。
サンプルコードの利用例では、正常な通信(200)、ページが見つからない場合(404)、そしてリダイレクトを含む通信のそれぞれで、CURLINFO_RESPONSE_CODEがどのように機能し、適切なHTTPレスポンスコードを返すかを確認できます。これにより、ウェブアプリケーション開発におけるHTTP通信の基本的な挙動とエラーハンドリングの理解を深めることができます。
CURLINFO_RESPONSE_CODEは、CURLOPT_FOLLOWLOCATIONが有効な場合、リダイレクト後の最終的なHTTPステータスコードを返します。cURLセッションはcurl_init()で初期化後、処理完了時やエラー発生時にも必ずcurl_close()で閉じ、リソースを適切に解放してください。ネットワークの状況によりエラーが発生することがありますので、curl_errno()やcurl_error()でエラーを必ず確認し、適切に対応することが重要です。CURLOPT_TIMEOUTを設定して最大実行時間を制限し、外部サービスへのアクセスによるプログラムの長時間停止を防ぎましょう。サンプルコードの関数は失敗時にfalseを返す可能性があるため、戻り値の型を常に確認し、安全なコードを記述してください。