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

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

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

作成日: 更新日:

基本的な使い方

CURLINFO_HTTP_CODE定数は、PHPのcURL拡張機能において、HTTPリクエストのステータスコードを表す定数です。この定数は、curl_getinfo()関数と組み合わせて使用され、指定されたcURLセッションで最後に実行されたHTTPリクエストの結果として、Webサーバーから返されたステータスコード(例: 200 OK, 404 Not Found, 500 Internal Server Error など)を取得するために用いられます。

Webサーバーとの通信が完了した後、そのリクエストが成功したのか、それとも何らかのエラーが発生したのかをプログラムで判断することは非常に重要です。CURLINFO_HTTP_CODE定数を使用することで、開発者は取得したステータスコードに基づいて、通信が成功(例: 2xx番台のコード)、リダイレクト(例: 3xx番台のコード)、クライアントエラー(例: 4xx番台のコード)、またはサーバーエラー(例: 5xx番台のコード)であったかを判別し、適切な処理を実行できます。

例えば、Web APIからのデータを取得する際に、ステータスコードが200であれば処理を続行し、404であればリソースが見つからなかったことをユーザーに通知するといった分岐処理を実装する際に不可欠な情報となります。このように、CURLINFO_HTTP_CODE定数は、PHPアプリケーションがWebリソースと安全かつ効率的に連携するために、HTTP通信の状態を正確に把握するための基本的な手段を提供するものです。

構文(syntax)

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

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

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

1<?php
2
3/**
4 * 指定されたURLへのHTTPリクエストを実行し、HTTPステータスコードを取得します。
5 *
6 * @param string $url リクエストを送信するURL
7 * @return int|false 成功した場合はHTTPステータスコード (例: 200, 404)、失敗した場合は false
8 */
9function getHttpStatusCode(string $url): int|false
10{
11    // cURL セッションを初期化します。
12    $ch = curl_init();
13
14    // cURL オプションを設定します。
15    // リクエスト先のURLを設定します。
16    curl_setopt($ch, CURLOPT_URL, $url);
17    // サーバーの応答を直接出力せず、文字列として取得するように設定します。
18    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
19    // リダイレクトを自動的に追跡するように設定します。
20    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
21
22    // cURL リクエストを実行し、応答を取得します。
23    curl_exec($ch);
24
25    // cURL 実行中にエラーが発生したかチェックします。
26    if (curl_errno($ch)) {
27        error_log('cURL エラー: ' . curl_error($ch));
28        curl_close($ch);
29        return false;
30    }
31
32    // CURLINFO_HTTP_CODE 定数を使用して、HTTP ステータスコードを取得します。
33    // この定数は、直前の cURL 転送操作で返された HTTP ステータスコードを表します。
34    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
35
36    // cURL セッションを終了し、リソースを解放します。
37    curl_close($ch);
38
39    return $httpCode;
40}
41
42// サンプルとして、GoogleのトップページのHTTPステータスコードを取得してみましょう。
43$targetUrl = 'https://www.google.com';
44echo "URL: {$targetUrl}" . PHP_EOL;
45
46// 関数を呼び出してHTTPステータスコードを取得します。
47$statusCode = getHttpStatusCode($targetUrl);
48
49// 取得したステータスコードを表示します。
50if ($statusCode !== false) {
51    echo "HTTP ステータスコード: {$statusCode}" . PHP_EOL;
52    if ($statusCode >= 200 && $statusCode < 300) {
53        echo "ステータス: 成功" . PHP_EOL;
54    } elseif ($statusCode >= 400 && $statusCode < 500) {
55        echo "ステータス: クライアントエラー" . PHP_EOL;
56    } elseif ($statusCode >= 500 && $statusCode < 600) {
57        echo "ステータス: サーバーエラー" . PHP_EOL;
58    } else {
59        echo "ステータス: その他の情報" . PHP_EOL;
60    }
61} else {
62    echo "HTTP ステータスコードの取得に失敗しました。" . PHP_EOL;
63}
64
65// 存在しないURLの例 (通常は404 Not Found を返します)
66$notFoundUrl = 'https://www.example.com/nonexistent-page-12345';
67echo PHP_EOL . "URL: {$notFoundUrl}" . PHP_EOL;
68$notFoundStatusCode = getHttpStatusCode($notFoundUrl);
69if ($notFoundStatusCode !== false) {
70    echo "HTTP ステータスコード: {$notFoundStatusCode}" . PHP_EOL;
71    if ($notFoundStatusCode === 404) {
72        echo "ステータス: ページが見つかりません (Not Found)" . PHP_EOL;
73    }
74} else {
75    echo "HTTP ステータスコードの取得に失敗しました。" . PHP_EOL;
76}

PHPのCURLINFO_HTTP_CODEは、Webサーバーとの通信を行うcURL拡張機能で使用される定数です。この定数は、直前に行ったHTTPリクエストの結果としてサーバーから返されたHTTPステータスコード(例えば「200 OK」や「404 Not Found」など)を取得するために利用されます。

定数自体に引数や戻り値はありませんが、curl_getinfo()関数にCURLINFO_HTTP_CODEを指定することで、cURLセッションで実行された通信のステータスコードを整数値で取得できます。

サンプルコードでは、指定されたURLに対してHTTPリクエストを送信し、その応答からHTTPステータスコードを取得するgetHttpStatusCode関数が定義されています。まずcurl_init()でcURLセッションを初期化し、curl_setopt()でリクエスト先のURLや動作オプション(例: レスポンスを文字列として取得、リダイレクト追跡)を設定します。その後curl_exec()でリクエストを実行し、curl_getinfo($ch, CURLINFO_HTTP_CODE)でHTTPステータスコードを取得します。最後にcurl_close()でセッションを閉じます。この関数は、成功した場合はステータスコードを整数で、失敗した場合はfalseを返します。これにより、Webサイトの正常性やエラーの状況をプログラムで判断できるようになります。

CURLINFO_HTTP_CODEは、curl_getinfo()関数でHTTPステータスコードを取得する際に指定する定数であり、この定数自体が値を返すものではありません。cURLによる通信処理では、curl_init()でセッションを開始したら、処理の最後に必ずcurl_close()でセッションを終了し、確保したシステムリソースを解放してください。リソースの解放忘れは、メモリリークなどシステムに負担をかける原因となります。また、ネットワーク通信は失敗する可能性があるため、curl_errno()curl_error()を使ってエラーを常に確認し、適切に処理を記述することが安全なコード運用のために不可欠です。この機能を利用するには、PHPのcURL拡張が事前にサーバーにインストールされ、有効化されている必要があります。

PHP: CURLINFO_HTTP_CODEでエラーコード0を調べる

1<?php
2
3/**
4 * CURLINFO_HTTP_CODE 定数を使用してHTTPステータスコードを取得し、
5 * 特にHTTPコード 0 が返されるケースをシステムエンジニアを目指す初心者向けに解説する関数です。
6 *
7 * HTTPコード 0 は、ネットワーク接続の失敗や、ホストへの到達不能など、
8 * HTTPレベルのリクエストが開始される前に問題が発生した場合に返されます。
9 */
10function demonstrateCurlHttpCodeHandling(): void
11{
12    // この例では、通常何も実行されていないローカルのポート9999に接続を試みます。
13    // これにより、接続タイムアウトや接続拒否が発生し、HTTPコード 0 が返される可能性が高まります。
14    $url = 'http://localhost:9999/';
15
16    echo "Attempting to connect to: " . $url . PHP_EOL;
17
18    // 1. cURL セッションを初期化
19    $ch = curl_init();
20
21    // 2. cURL オプションを設定
22    curl_setopt($ch, CURLOPT_URL, $url); // リクエスト先のURL
23    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 実行結果を文字列で返す
24    // 接続タイムアウトを設定(短い時間にすることで、エラーを早く発生させます)
25    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); // 接続試行を2秒でタイムアウト
26
27    // 3. cURL セッションを実行
28    $response = curl_exec($ch);
29
30    // 4. cURL エラーが発生した場合のチェック
31    if (curl_errno($ch)) {
32        echo "cURL error occurred: " . curl_error($ch) . PHP_EOL;
33    }
34
35    // 5. CURLINFO_HTTP_CODE を使用してHTTPステータスコードを取得
36    // CURLINFO_HTTP_CODE は、curl_getinfo() の第2引数として渡され、
37    // 最後に受信したHTTPステータスコード(整数)を返します。
38    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
39
40    echo "Retrieved HTTP Status Code: " . $httpCode . PHP_EOL;
41
42    // 6. 取得したHTTPコードに基づいて結果を判定し、初心者向けに解説
43    if ($httpCode === 0) {
44        // HTTPコードが0の場合、ネットワーク層での問題(DNS解決失敗、接続拒否、タイムアウトなど)
45        // が発生し、HTTPリクエスト自体がサーバーに到達できなかったことを示します。
46        // つまり、HTTPレスポンスを受け取る以前に何らかの通信エラーが発生しています。
47        echo "Interpretation: HTTP Status Code is 0. This means the cURL request could not establish a connection to the server or encountered a network error before receiving any HTTP response. "
48             . "The server was likely unreachable or refused the connection (e.g., no service running on localhost:9999)." . PHP_EOL;
49    } elseif ($httpCode >= 200 && $httpCode < 300) {
50        // 2xx のコード(例: 200 OK)は、リクエストが成功したことを示します。
51        echo "Interpretation: HTTP Status Code indicates success (e.g., 200 OK)." . PHP_EOL;
52    } else {
53        // その他のコードは、リダイレクト、クライアントエラー、サーバーエラーなどを示します。
54        // (例: 301 Moved Permanently, 404 Not Found, 500 Internal Server Error)。
55        // これらのコードは、リクエストがサーバーに到達し、サーバーが何らかのレスポンスを返したことを意味します。
56        echo "Interpretation: HTTP Status Code indicates a server response (e.g., 404 Not Found, 500 Internal Server Error). "
57             . "The request reached the server, but the server responded with an error or redirection." . PHP_EOL;
58    }
59
60    // 7. cURL セッションを閉じる
61    curl_close($ch);
62}
63
64// 関数を実行して動作を確認します
65demonstrateCurlHttpCodeHandling();
66
67?>

PHPのCURLINFO_HTTP_CODE定数は、cURLという外部サーバーと通信するための機能において、WebサーバーからのHTTPステータスコードを取得するために使用されます。この定数をcurl_getinfo()関数と組み合わせて使うことで、ウェブサイトにリクエストを送った結果、どのような状態になったかを確認できます。

サンプルコードでは、存在しないローカルのポートに接続を試みることで、HTTPステータスコードが「0」になる状況を意図的に作り出し、その意味を解説しています。まず、curl_init()でcURL通信の準備を始め、curl_setopt()で接続先のURL(例: http://localhost:9999/)や、接続のタイムアウト時間などを設定します。その後、curl_exec()で実際にリクエストを実行します。

リクエストが完了したら、curl_getinfo()関数の第2引数にCURLINFO_HTTP_CODEを渡すことで、最後に受信したHTTPステータスコードを取得します。ここで得られる戻り値は整数で、例えば「200」は成功、「404」はページが見つからないことを示します。特に「0」というコードが返された場合、これはHTTPリクエスト自体がサーバーに到達する前に、ネットワーク接続の失敗やタイムアウトといった問題が発生したことを意味します。つまり、サーバーからHTTPレスポンスを受け取ることすらできなかった状況を表します。この状態は、サーバーがダウンしている、指定されたポートでサービスが実行されていない、またはネットワーク経路に問題がある場合に発生しやすいです。コードは、このHTTPコード0の発生と、2xx(成功)、その他(4xx/5xxなど)のコードとの違いを初心者にも分かりやすく説明しています。最後にcurl_close()で通信を終了します。

サンプルコードでは、CURLINFO_HTTP_CODEが返す「0」というHTTPステータスコードの特別な意味を理解することが重要です。このコードは、HTTPリクエストがサーバーに到達する前に、ネットワーク接続の失敗やタイムアウトといった問題が発生したことを示します。通常の200番台、400番台、500番台のHTTPコードとは異なり、サーバーからの応答ではないため注意が必要です。

HTTPコードが0の場合、curl_errno()curl_error()関数を使って、さらに詳しいエラー原因を確認するようにしてください。また、CURLOPT_CONNECTTIMEOUTなどのタイムアウト設定は、通信が途絶した場合に処理が停止し続けないよう、適切に設定することが安全なコード運用のために非常に大切です。最後に、必ずcurl_close()でリソースを解放するようにしましょう。

関連コンテンツ