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

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

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

作成日: 更新日:

基本的な使い方

CURLINFO_OS_ERRNO定数は、PHPのcURL拡張機能において、直前のcURL転送で発生したオペレーティングシステム(OS)固有のエラー番号を表す定数です。この定数は、curl_getinfo() 関数と組み合わせて使用され、cURL操作中にOSレベルでどのような問題が発生したかを詳細に診断するために利用されます。

通常、cURLは自身のライブラリ固有のエラーコードを返しますが、CURLINFO_OS_ERRNOは、さらにその下の層、つまりTCP/IPスタックやソケット操作、ファイルシステムアクセスなど、システムコールレベルで発生したエラーに焦点を当てます。例えば、ネットワークインターフェースが利用できない場合や、メモリ不足、特定のシステムリソースが枯渇しているといった状況で、OSがエラーコードを返した場合にその値を取得できます。

この定数を指定してcurl_getinfo()関数を実行すると、エラーがなければ0が返され、エラーがあれば該当するOSのエラー番号が整数値で返されます。このエラー番号は、通常、C言語のerrno変数と同じ意味を持ち、各OSが定義するシステムエラーコードに対応しています。システムエンジニアを目指す方にとって、ネットワーク接続の問題やシステムリソースの制約など、通常のcURLエラーだけでは原因が特定しにくいケースにおいて、より具体的なトラブルシューティングの手がかりを得るための重要な情報源となります。これにより、より深いレベルでの問題解決が可能になります。

構文(syntax)

1echo CURLINFO_OS_ERRNO;

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURLでHTTPコードとOSエラー番号を取得する

1<?php
2
3/**
4 * 指定されたURLにHTTPリクエストを送信し、そのレスポンスコードと
5 * オペレーティングシステムのエラー番号を取得します。
6 *
7 * @param string $url リクエストを送信するURL
8 * @return array|false 成功した場合は、HTTPレスポンスコードとOSエラー番号を含む配列を返します。
9 *                     cURLの初期化に失敗した場合はfalse、cURL実行中にエラーが発生した場合は
10 *                     エラーメッセージを含む配列を返します。
11 */
12function getUrlResponseInfo(string $url)
13{
14    // cURLセッションを初期化します。
15    $ch = curl_init();
16
17    // cURLの初期化に失敗した場合
18    if ($ch === false) {
19        error_log("CURLの初期化に失敗しました。");
20        return false;
21    }
22
23    // cURLオプションを設定します。
24    // リクエストを送信するURLを設定します。
25    curl_setopt($ch, CURLOPT_URL, $url);
26    // レスポンスを直接出力せず、文字列として取得するように設定します。
27    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
28    // HTTPヘッダー情報をレスポンスに含めないように設定します。
29    curl_setopt($ch, CURLOPT_HEADER, false);
30    // HTTPリダイレクトを自動的に追跡するように設定します。
31    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
32    // タイムアウトを10秒に設定します。
33    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
34
35    // cURLセッションを実行し、レスポンスを取得します。
36    $response = curl_exec($ch);
37
38    // cURLの実行中にエラーが発生したか確認します。
39    if (curl_errno($ch)) {
40        $errorMessage = curl_error($ch);
41        // エラーが発生した場合、OSのエラー番号も取得してみます。
42        // CURLINFO_OS_ERRNO はOSレベルのエラー番号を返します。
43        $osErrnoOnError = curl_getinfo($ch, CURLINFO_OS_ERRNO);
44        curl_close($ch);
45        return [
46            'http_code' => 0, // エラー時には0または適切な値を設定
47            'os_errno' => $osErrnoOnError,
48            'error_message' => "cURLエラー: " . $errorMessage
49        ];
50    }
51
52    // HTTPレスポンスコードを取得します。(キーワード: CURLINFO_RESPONSE_CODE に関連)
53    // CURLINFO_HTTP_CODE はHTTPステータスコード(例: 200, 404)を返します。
54    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
55
56    // オペレーティングシステムのエラー番号を取得します。(リファレンス情報: CURLINFO_OS_ERRNO)
57    // 転送が成功した場合でも、OSエラーがない場合は0を返します。
58    $osErrno = curl_getinfo($ch, CURLINFO_OS_ERRNO);
59
60    // cURLセッションを閉じます。
61    curl_close($ch);
62
63    // 取得した情報を配列として返します。
64    return [
65        'http_code' => $httpCode,
66        'os_errno' => $osErrno,
67        // 'response_body' => $response, // 必要であればレスポンスボディも返せます
68    ];
69}
70
71// --- 関数利用例 ---
72$targetUrl = "https://www.google.com"; // 存在するURLの例
73echo "URL: " . $targetUrl . "\n";
74$info = getUrlResponseInfo($targetUrl);
75
76if ($info !== false) {
77    if (isset($info['error_message'])) {
78        echo "  エラー: " . $info['error_message'] . "\n";
79    }
80    echo "  HTTPレスポンスコード: " . $info['http_code'] . "\n";
81    echo "  OSエラー番号: " . $info['os_errno'] . "\n";
82} else {
83    echo "  情報取得に失敗しました。\n";
84}
85
86echo "\n--- 存在しないドメインへのリクエスト例 (OSエラーが発生しやすい) ---\n";
87$invalidUrl = "http://this.domain.does.not.exist.example.com";
88echo "URL: " . $invalidUrl . "\n";
89$invalidInfo = getUrlResponseInfo($invalidUrl);
90
91if ($invalidInfo !== false) {
92    if (isset($invalidInfo['error_message'])) {
93        echo "  エラー: " . $invalidInfo['error_message'] . "\n";
94    }
95    echo "  HTTPレスポンスコード: " . $invalidInfo['http_code'] . "\n";
96    echo "  OSエラー番号: " . $invalidInfo['os_errno'] . "\n";
97} else {
98    echo "  情報取得に失敗しました。\n";
99}

このPHPサンプルコードは、指定されたURLにHTTPリクエストを送信し、その結果としてHTTPレスポンスコードとオペレーティングシステム(OS)のエラー番号を取得するgetUrlResponseInfo関数を提供しています。

関数getUrlResponseInfoは、リクエストを送信するURLを$urlとして文字列型の引数で受け取ります。処理が成功した場合は、HTTPレスポンスコードとOSエラー番号を含む連想配列を返します。cURLの初期化に失敗した場合はfalseを返し、cURL実行中にエラーが発生した場合は、エラーメッセージと発生したOSエラー番号を含む配列を返します。

関数内部では、curl_initでcURLセッションを初期化し、CURLOPT_URLCURLOPT_RETURNTRANSFERなどのオプションを設定してリクエストを実行します。リクエスト後、curl_getinfo関数を使用して詳細情報を取得します。

HTTPレスポンスコードはCURLINFO_HTTP_CODECURLINFO_RESPONSE_CODEと同じ意味合いで使用されます)定数を用いて取得され、ウェブサーバーからの応答状態(例: 200 OK、404 Not Found)を示します。一方、CURLINFO_OS_ERRNO定数を用いることで、ネットワーク接続問題などOSレベルで発生したエラーの番号を取得できます。通信が正常に完了しOSレベルでの問題がない場合は通常0が返されます。

サンプルコードの後半では、実際のURLと存在しないURLへのリクエスト例を通じて、HTTPレスポンスコードやOSエラー番号がどのように取得され、エラー発生時にどのような情報が得られるかを確認することができます。特に存在しないドメインへのリクエストでは、OSエラーが発生しやすい状況が示されています。

このサンプルコードでは、ネットワークリクエストに関する多様なエラーや成功を判断する方法が示されています。curl_init()curl_exec()の戻り値を必ず確認し、エラーハンドリングを丁寧に行うことが重要です。特にCURLINFO_OS_ERRNOは、OSやネットワーク層での問題(例: DNS解決失敗)が発生した場合に役立つ低レベルのエラー番号を返します。通常のリクエスト成功時には0となります。一方、キーワードが指すCURLINFO_RESPONSE_CODEは、PHPのcURL拡張ではCURLINFO_HTTP_CODEとして利用され、HTTPプロトコルレベルのステータスコードであり、サーバーからの応答状況を示します。curl_close()によるリソースの解放を忘れないようにし、CURLOPT_TIMEOUTでタイムアウトを設定してプログラムが停止しないように注意しましょう。

PHP cURL: HTTPコードとOSエラー番号を取得する

1<?php
2
3/**
4 * 指定されたURLにHTTPリクエストを送信し、HTTPステータスコードとOSレベルのエラー番号を取得します。
5 *
6 * この関数は、ウェブサーバーとの通信結果を理解するための基本的なcURLの使い方を
7 * システムエンジニアを目指す初心者にも分かりやすく示します。
8 * CURLINFO_HTTP_CODE はHTTP通信の成否を、CURLINFO_OS_ERRNO はOSレベルの問題を示します。
9 *
10 * @param string $url リクエストを送信するターゲットURL。
11 * @return array|false HTTPステータスコード、OSエラー番号、およびオプションでレスポンスボディを含む配列を返します。
12 *                     cURLの初期化に失敗した場合は false を返します。
13 */
14function getUrlCommunicationInfo(string $url): array|false
15{
16    // cURLセッションを初期化します。
17    // この$ch変数を通じて、ウェブサーバーとの通信を管理します。
18    $ch = curl_init();
19
20    // cURLの初期化が失敗した場合は、エラーを記録してfalseを返します。
21    if ($ch === false) {
22        error_log('cURLセッションの初期化に失敗しました。');
23        return false;
24    }
25
26    // cURLオプションを設定します。
27    // CURLOPT_URL: リクエストを送信するURLを指定します。
28    curl_setopt($ch, CURLOPT_URL, $url);
29    // CURLOPT_RETURNTRANSFER: curl_exec() が結果を文字列として返すように設定します。
30    // これを設定しないと、curl_exec() は取得したコンテンツを直接出力してしまいます。
31    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
32    // CURLOPT_TIMEOUT: 接続とデータ転送の最大時間を秒単位で設定します。
33    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 例: 10秒
34
35    // cURLリクエストを実行し、レスポンスボディを取得します。
36    // 実際にウェブサーバーとの通信が行われます。
37    $responseBody = curl_exec($ch);
38
39    // cURL操作中にエラーが発生したかを確認します。
40    // ネットワークの問題などで通信が失敗した場合にエラー番号がセットされます。
41    if (curl_errno($ch)) {
42        $errorMessage = curl_error($ch);
43        error_log("cURL操作中にエラーが発生しました: {$errorMessage}");
44    }
45
46    // HTTPステータスコードを取得します。
47    // これは `CURLINFO_HTTP_CODE` を使用したキーワードの関連性の高い情報です。
48    // 例: 200 (成功), 404 (見つからない), 500 (サーバーエラー) など。
49    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
50
51    // OSレベルのエラー番号を取得します。
52    // これはリファレンス情報で指定された `CURLINFO_OS_ERRNO` の使用例です。
53    // OSが関与するエラー (例: DNS解決失敗、ネットワーク接続断) の場合に0以外の値になります。
54    $osErrno = curl_getinfo($ch, CURLINFO_OS_ERRNO);
55
56    // cURLセッションを閉じ、関連するリソースを解放します。
57    curl_close($ch);
58
59    // 取得した情報を連想配列として返します。
60    return [
61        'http_code' => $httpCode,
62        'os_errno' => $osErrno,
63        'response_body' => $responseBody, // レスポンスボディも返しますが、メインは上記のコード情報です。
64    ];
65}
66
67// --- 関数利用の例 ---
68// 実際に存在するURLを設定してください。
69// 例: Googleのトップページ
70$targetUrl = 'https://www.google.com';
71
72// 存在しないURLやエラーを発生させやすいURLで試すこともできます。
73// $targetUrl = 'https://nonexistent-domain-for-test.com'; // DNS解決エラー (CURLINFO_OS_ERRNO に影響)
74// $targetUrl = 'https://httpstat.us/404'; // 404 Not Found (CURLINFO_HTTP_CODE に影響)
75
76$info = getUrlCommunicationInfo($targetUrl);
77
78if ($info !== false) {
79    echo "--- cURL通信結果 ---\n";
80    echo "URL: " . $targetUrl . "\n";
81    echo "HTTPステータスコード: " . ($info['http_code'] ?? 'N/A') . "\n";
82    echo "OSエラー番号: " . ($info['os_errno'] ?? 'N/A') . "\n";
83
84    // 初心者向けに、取得したコードの意味を簡単に説明します。
85    if (isset($info['http_code'])) {
86        if ($info['http_code'] >= 200 && $info['http_code'] < 300) {
87            echo "-> HTTP通信は成功しました (ステータスコード: {$info['http_code']}).\n";
88        } elseif ($info['http_code'] >= 400 && $info['http_code'] < 500) {
89            echo "-> クライアント側で問題が発生しました (例: ページが見つからない、リクエストが不正). ステータスコード: {$info['http_code']}.\n";
90        } elseif ($info['http_code'] >= 500 && $info['http_code'] < 600) {
91            echo "-> サーバー側で問題が発生しました (例: サーバー内部エラー). ステータスコード: {$info['http_code']}.\n";
92        } else {
93            echo "-> 予期しないHTTPステータスコードです: {$info['http_code']}.\n";
94        }
95    }
96
97    if (isset($info['os_errno']) && $info['os_errno'] !== 0) {
98        echo "-> OSレベルでエラーが発生している可能性があります。ネットワーク接続やDNS設定を確認してください。\n";
99    } elseif (isset($info['os_errno']) && $info['os_errno'] === 0 && isset($info['http_code'])) {
100        echo "-> OSレベルでの明示的なエラーはありませんでした。\n";
101    }
102
103    // 取得したレスポンスボディの最初の100文字を表示する例 (デバッグ用)
104    // echo "\nレスポンスボディの一部:\n";
105    // echo mb_substr($info['response_body'] ?? 'レスポンスなし', 0, 100) . (mb_strlen($info['response_body'] ?? '') > 100 ? '...' : '') . "\n";
106
107} else {
108    echo "URL情報の取得に失敗しました。\n";
109}

このPHPサンプルコードは、指定されたURLへHTTPリクエストを送信し、その結果からHTTPステータスコードとOSレベルのエラー番号を取得する基本的なcURLの使い方を、システムエンジニアを目指す初心者向けに示しています。ウェブアプリケーションが外部サービスと通信する際に何が起きているのかを理解するための基礎となります。

getUrlCommunicationInfo関数は、リクエスト先のURLを引数として受け取ります。関数内部では、まずcURLセッションを初期化し、ターゲットURLやレスポンスを文字列として取得する設定を行います。その後、curl_exec()で実際にウェブサーバーとの通信を実行します。

通信結果の取得にはcurl_getinfo()関数が使われます。ここで特に重要なのが、CURLINFO_HTTP_CODECURLINFO_OS_ERRNOの二つの定数です。CURLINFO_HTTP_CODEは、ウェブサーバーからの応答を示すHTTPステータスコード(例: 200 OK、404 Not Found、500 Internal Server Errorなど)を取得し、アプリケーションレベルでの処理の成否を判断するのに役立ちます。一方、CURLINFO_OS_ERRNOは、OSレベルで発生したエラー番号を取得します。これは、DNS解決の失敗やネットワーク接続の問題といった、より低レベルな通信障害が発生した場合に0以外の値が返され、ネットワークインフラの問題を特定する重要な手がかりとなります。

関数は、これらの情報とレスポンスボディを含む連想配列を戻り値として返します。もしcURLセッションの初期化に失敗した場合はfalseが返されます。このコードを通じて、通信の成功・失敗だけでなく、その原因がHTTPプロトコルレベルにあるのか、あるいはOSやネットワークインフラレベルにあるのかを切り分けて考えるための基本が学べます。

このサンプルコードでは、ウェブサーバーからの応答を示すCURLINFO_HTTP_CODEと、ネットワーク接続などOSレベルの問題を示すCURLINFO_OS_ERRNOという異なる種類のエラー情報を扱っています。初心者が間違いやすい点として、これらのエラーがそれぞれ異なる層の問題を示していることを理解することが重要です。cURLセッションの初期化失敗や通信中のエラーを適切に検知するため、curl_init()の戻り値やcurl_errno()によるチェックを怠らないでください。また、通信後は必ずcurl_close()でリソースを解放し、システムの安定性を保つようにしましょう。CURLOPT_TIMEOUTは通信の最大時間を指定する重要な設定ですので、適切な値を設定し、無限に待機する状態を避けることが推奨されます。

関連コンテンツ

関連IT用語

関連プログラミング言語