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

【PHP8.x】curl_errno()関数の使い方

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

作成日: 更新日:

基本的な使い方

curl_errno関数は、指定されたCURLセッションにおける直近のエラーコードを取得する関数です。PHPでWebサイトへのデータ送信や受信といったネットワーク通信を行う際に、CURLライブラリが利用されます。このcurl_errno関数は、curl_exec()などのCURL操作が予期せず失敗した場合に、何が原因でエラーが発生したのかを数値で確認するために使用されます。

この関数は、curl_init()関数によって初期化されたCURLセッションのハンドル(CurlHandleオブジェクト)を唯一の引数として受け取ります。そして、最後に発生したエラーの番号を整数値で返します。もし、CURLセッションでエラーが一つも発生していない場合は、戻り値として0(ゼロ)を返します。

例えば、Web APIへのリクエストがタイムアウトしたり、指定したURLが見つからなかったりといった問題が発生した際に、curl_errno()関数を使ってエラーコードを取得し、その数値に基づいてプログラム内で適切なエラー処理を実行することができます。

エラーコードの具体的な意味を知りたい場合には、curl_error()関数を利用することで、エラーメッセージを文字列として取得することが可能です。また、より一般的なエラーコードの説明文を取得するには、curl_strerror()関数を使用できます。ネットワーク通信を扱うアプリケーション開発において、エラーの原因を正確に特定し、適切に対応するためにcurl_errno関数は欠かせない機能です。

構文(syntax)

1<?php
2$curlHandle = curl_init();
3$errorCode = curl_errno($curlHandle);
4?>

引数(parameters)

CurlHandle $handle

  • CurlHandle $handle: エラーコードを取得したいcURLセッションを表すオブジェクト

戻り値(return)

int

PHPのcurl_errno関数は、実行されたcURLセッションで発生した直近のエラー番号を整数で返します。エラーが発生しなかった場合は0が返されます。

サンプルコード

PHP curl_errnoでタイムアウトエラー28を検出する

1<?php
2
3/**
4 * cURLのタイムアウトエラー(コード28)を意図的に発生させ、
5 * curl_errno関数の使い方を示すサンプルコードです。
6 *
7 * この関数は、短いタイムアウト設定でWebサイトへのアクセスを試み、
8 * 発生したcURLエラーコードとそのメッセージを表示します。
9 * 特に、キーワード「28」が示すタイムアウトエラーの検出に焦点を当てています。
10 */
11function demonstrateCurlErrnoForTimeoutError(): void
12{
13    // cURLセッションを初期化します。成功するとCurlHandleオブジェクトを返します。
14    $ch = curl_init();
15
16    if ($ch === false) {
17        echo "cURLセッションの初期化に失敗しました。\n";
18        return;
19    }
20
21    // アクセス対象のURLを設定します。
22    // 短いタイムアウトを設定することで、実在するWebサイトでもタイムアウトエラーを誘発しやすくなります。
23    curl_setopt($ch, CURLOPT_URL, "http://example.com");
24
25    // 転送結果を文字列として返すように設定します。
26    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
27
28    // タイムアウトを1秒に設定します。
29    // これにより、応答が1秒以内にない場合にエラーコード28 (CURLE_OPERATION_TIMEDOUT) が発生しやすくなります。
30    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
31
32    echo "cURLリクエストを開始します... (タイムアウト設定: 1秒)\n";
33
34    // cURLセッションを実行し、結果を取得します。
35    $response = curl_exec($ch);
36
37    // curl_exec()がfalseを返した場合、エラーが発生しています。
38    if ($response === false) {
39        // curl_errno()関数を使って、発生したエラーの数値コードを取得します。
40        // 引数にはCurlHandleオブジェクトを渡します。戻り値はint型です。
41        $errorCode = curl_errno($ch);
42
43        // curl_error()関数を使って、エラーの具体的なメッセージを取得します。
44        $errorMessage = curl_error($ch);
45
46        echo "cURLエラーが発生しました。\n";
47        echo "エラーコード: " . $errorCode . "\n";
48        echo "エラーメッセージ: " . $errorMessage . "\n";
49
50        // 取得したエラーコードが28かどうかをチェックします。
51        if ($errorCode === 28) {
52            echo ">>> これは操作がタイムアウトしたことを示すエラーです (CURLE_OPERATION_TIMEDOUT)。 <<<\n";
53            echo "指定された時間内にサーバーからの応答がなかった可能性があります。\n";
54        } else {
55            echo "その他のcURLエラーが発生しました。このコードは28ではありません。\n";
56        }
57    } else {
58        echo "cURLリクエストは成功しました。\n";
59        echo "応答の長さ: " . strlen($response) . "バイト\n";
60        // 必要に応じて応答内容の一部を表示できます。
61        // echo "応答内容のプレビュー: " . substr($response, 0, 200) . "...\n";
62    }
63
64    // cURLセッションを閉じ、リソースを解放します。
65    curl_close($ch);
66}
67
68// 上記で定義した関数を実行します。
69demonstrateCurlErrnoForTimeoutError();
70
71?>

このサンプルコードは、PHPのcurl_errno関数を使って、cURLライブラリで発生したエラーコードを取得する方法を示しています。特に、タイムアウトエラー(エラーコード28)の検出に焦点を当てています。

まず、curl_init()関数でcURLセッションを初期化し、curl_setopt()関数で接続先URLやタイムアウト時間などのオプションを設定します。ここでは、タイムアウトを1秒と短く設定することで、意図的にタイムアウトエラーを発生させやすくしています。

curl_exec()関数を実行してWebサイトへのアクセスを試みます。もしエラーが発生した場合、curl_exec()falseを返します。この時、curl_errno($ch)関数を使うことで、発生したエラーの数値コードを取得できます。引数には、curl_init()で初期化したCurlHandleオブジェクト $ch を渡します。curl_errno()関数は、発生したエラーに対応する整数値(int型)を返します。エラーコードが28の場合、「操作がタイムアウトした」というエラーであることがわかります。

curl_error()関数を使えば、エラーの具体的なメッセージも取得可能です。最後に、curl_close()関数でcURLセッションを閉じ、リソースを解放します。このサンプルを通じて、cURLのエラー処理におけるcurl_errno関数の役割を理解できます。

curl_errno関数利用時の注意点です。curl_errnoは、curl_execfalseを返した場合にのみ意味のあるエラーコードを返します。成功時には0が返るので、実行前にエラーコードをリセットする必要はありません。

エラーコード28(タイムアウト)は、ネットワーク環境やサーバーの状態に左右されやすいです。常に発生するとは限りません。

curl_closeでセッションを必ず終了してください。リソースリークを防ぎます。

URLは、実在するURLに変更して動作確認してください。タイムアウト時間は、ネットワーク環境に合わせて調整してください。CURLOPT_TIMEOUTは秒単位で指定します。ミリ秒単位ではありません。

PHP cURL エラーコード 3 を取得する

1<?php
2
3/**
4 * CURL リクエストを実行し、URL形式が不正な場合のエラー処理を示す関数です。
5 * curl_errno を使用してエラーコードを取得する方法を紹介します。
6 */
7function demonstrateCurlErrorHandling(): void
8{
9    // cURL セッションを初期化します。
10    // curl_init() は CurlHandle オブジェクトを返します。
11    $ch = curl_init();
12
13    // 不完全なURLを設定し、意図的にエラーを発生させます。
14    // この設定により、CURLE_URL_MALFORMAT (エラーコード 3) が発生します。
15    $invalidUrl = "http://";
16    curl_setopt($ch, CURLOPT_URL, $invalidUrl);
17
18    // リクエスト結果を文字列として受け取るように設定します。
19    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
20
21    // cURL リクエストを実行します。
22    // エラーが発生した場合、curl_exec() は false を返します。
23    $response = curl_exec($ch);
24
25    // リクエストが失敗したかどうかを確認します。
26    if ($response === false) {
27        // curl_errno() を使用して、cURL セッションの最後のエラーコードを取得します。
28        $errorCode = curl_errno($ch);
29
30        // curl_error() を使用して、cURL セッションの最後のエラーメッセージを取得します。
31        $errorMessage = curl_error($ch);
32
33        echo "CURL リクエスト中にエラーが発生しました。\n";
34        echo "エラーコード: " . $errorCode . "\n";
35        echo "エラーメッセージ: " . $errorMessage . "\n";
36
37        // 特定のエラーコード (URL形式不正: 3) であるかを確認します。
38        if ($errorCode === 3) {
39            echo "これは、'URL形式が不正' (CURLE_URL_MALFORMAT) という想定されたエラーです。\n";
40        }
41    } else {
42        // リクエストが成功した場合の処理 (この例では実行されません)
43        echo "CURL リクエストは成功しました。\n";
44        echo "レスポンス: " . $response . "\n";
45    }
46
47    // cURL セッションを閉じ、リソースを解放します。
48    curl_close($ch);
49}
50
51// 関数を実行します。
52demonstrateCurlErrorHandling();
53
54?>

curl_errno関数は、PHPでHTTP通信を行うためのcURLライブラリにおいて、最後のcURL操作で発生したエラーのコードを取得するために使用されます。

この関数はCurlHandle $handleという引数を一つ受け取ります。この$handleは、curl_init()関数で初期化されたcURLセッションのリソースを表し、どのセッションのエラーコードを知りたいのかを指定します。戻り値はint型で、エラーが発生しなかった場合は0を、エラーが発生した場合は対応するエラーコードを整数値で返します。

提供されたサンプルコードでは、意図的に不完全なURLを設定し、curl_exec()の実行時にURL形式が不正であるというエラー(エラーコード3: CURLE_URL_MALFORMAT)を発生させています。curl_exec()falseを返してリクエストが失敗した際に、curl_errno($ch)を呼び出すことで、このエラーコード3を正確に取得し、エラーの種類を特定しています。これにより、プログラムはエラーの種類に応じて適切な処理(例えば、ユーザーへのエラーメッセージ表示やログ記録など)を行うことが可能になります。cURL操作のエラーハンドリングにおいて、curl_errnoはエラーの原因を特定する上で不可欠な関数です。

curl_errno()curl_error()は、curl_exec()falseを返した、つまりリクエストが失敗した場合に、どのような問題が発生したのかを詳細に確認するために使用します。リクエストが成功した際には、これらの関数を呼び出す必要はありません。curl_errno()が返す数値のエラーコードは、CURLの公式ドキュメントでその具体的な意味や原因を調べることができます。cURLセッションの使用後には、必ずcurl_close()を呼び出し、開いたリソースを適切に解放してください。これを怠ると、システムのリソースを不必要に消費し続ける原因となります。実際の開発では、ネットワーク接続の問題やターゲットサーバーからの応答など、様々な要因でエラーが発生する可能性があるため、多岐にわたるエラーケースを考慮した堅牢なエラーハンドリングを実装することが重要です。

PHP cURL エラー番号 7 を取得する

1<?php
2
3/**
4 * cURLリクエストを実行し、エラーが発生した場合はその情報を表示する関数。
5 * 特に「curl_errno 7」(ホストに接続できません)のようなネットワークエラーを
6 * 意図的に発生させる例として、存在しないドメインへのリクエストを試みます。
7 */
8function demonstrateCurlErrno(): void
9{
10    // cURLセッションを初期化
11    $ch = curl_init();
12
13    // 存在しないドメインを指定し、意図的に接続エラーを発生させる
14    // これにより「curl_errno 7」(Couldn't connect to host)が発生する可能性が高い
15    $url = "http://this-domain-will-not-exist.invalid/";
16    curl_setopt($ch, CURLOPT_URL, $url);
17
18    // cURLが取得したデータを直接出力せず、文字列として返すように設定
19    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
20
21    // タイムアウト時間を短く設定し、エラーを早く検出させる (オプション)
22    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 接続タイムアウト
23    curl_setopt($ch, CURLOPT_TIMEOUT, 10);     // 実行タイムアウト
24
25    echo "指定URL: " . $url . "\n";
26    echo "cURLリクエストを実行中...\n";
27
28    // cURLリクエストを実行
29    curl_exec($ch);
30
31    // cURL操作で発生したエラー番号を取得
32    $error_no = curl_errno($ch);
33
34    // エラー番号が0でない場合はエラーが発生している
35    if ($error_no !== 0) {
36        // エラー番号と対応するエラーメッセージを表示
37        echo "cURLエラーが発生しました。\n";
38        echo "エラー番号: " . $error_no . "\n";
39        echo "エラーメッセージ: " . curl_strerror($error_no) . "\n";
40        echo "このエラーは通常、指定されたホストが存在しないか、\n";
41        echo "ネットワークに到達できない場合に発生します。\n";
42    } else {
43        echo "cURLリクエストはエラーなしで完了しました。\n";
44        // 成功時の処理をここに記述
45    }
46
47    // cURLセッションを閉じる
48    curl_close($ch);
49}
50
51// 関数を実行
52demonstrateCurlErrno();
53
54?>

PHPのcurl_errno関数は、cURLを使ってウェブサイトへのアクセスなどのネットワーク通信を行った際に、エラーが発生したかどうかを確認し、そのエラーの種類を示す番号を取得するために使用されます。この関数は、引数として操作対象のcURLセッション(CurlHandle $handle)を受け取り、そのセッションで最後に発生したエラーの番号を整数(int)で返します。エラーが発生していない場合は0を返します。

提供されたサンプルコードでは、存在しないドメインへのHTTPリクエストを試みることで、意図的にcURLエラーを発生させています。これにより、多くの場合「エラー番号7」(ホストに接続できません)というエラーが発生します。このエラーは、指定されたサーバーが見つからない、またはネットワーク的な問題で接続できない際に発生します。

コードはまずcURLセッションを初期化し、意図的にエラーを起こすURLなどの設定を行った後、curl_exec()でリクエストを実行します。そして、curl_errno($ch)を呼び出してエラー番号を取得し、それが0以外であればエラーが発生していると判断します。エラー発生時には、curl_strerror()関数と組み合わせて、エラー番号に対応する具体的なエラーメッセージも表示することで、どのような問題が起きたのかを詳しく確認できるようになっています。これにより、システムエンジニアを目指す初心者がネットワーク関連のエラー処理の基礎を学ぶことができます。

curl_errnocurl_execの直後に呼び出し、cURL通信が成功したかを確認する重要な関数です。エラー番号が0以外の時は通信に問題があったことを示します。curl_strerrorと組み合わせると、具体的なエラーメッセージが得られ、原因特定に役立ちます。このコードは存在しないドメインで意図的にエラーを発生させていますが、実運用ではネットワーク環境、URLの誤り、相手サーバーの停止などが原因で同様のエラーが発生します。リソースを適切に解放するため、curl_closeを忘れずに実行してください。また、タイムアウト設定は、無応答状態でのプログラム停止を防ぎ、エラー検出を早める良い実践方法です。

PHP curl_errnoでSSL証明書エラー77を検出する

1<?php
2
3/**
4 * PHPのcurl_errno関数を使って、特定のエラーコード(77)を捕捉するサンプルコードです。
5 *
6 * システムエンジニアを目指す初心者向けに、CURLリクエスト中に発生したエラーを検出し、
7 * そのエラーコードに基づいて適切な処理を行う方法を示します。
8 * 特に、エラーコード77 (CURLE_SSL_CACERT) はSSL証明書の検証失敗を意味します。
9 */
10function demonstrateCurlErrnoError77(): void
11{
12    // CURLハンドルの初期化
13    // 任意の有効なHTTPSサイトをターゲットに設定します。
14    // SSL証明書の検証エラーを意図的に発生させるため、このURL自体は重要ではありません。
15    $targetUrl = 'https://www.example.com/';
16    $curlHandle = curl_init($targetUrl);
17
18    if ($curlHandle === false) {
19        echo "エラー: CURLハンドルの初期化に失敗しました。\n";
20        return;
21    }
22
23    // オプション設定: CURLリクエストの実行結果を文字列として返すように設定
24    curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
25
26    // オプション設定: SSLピアの証明書を検証する (セキュリティ上推奨される設定)
27    // デフォルトでtrueですが、明示的に指定することで意図を明確にします。
28    curl_setopt($curlHandle, CURLOPT_SSL_VERIFYPEER, true);
29
30    // !!! キーワード '77' に関連するエラーを意図的に発生させる設定 !!!
31    // CURLOPT_CAINFO に存在しないパスを指定することで、CURLがサーバー証明書を
32    // 信頼できるCAに対して検証できなくなり、「CURLE_SSL_CACERT」エラー (77) が発生します。
33    // 本番環境では、有効なCA証明書バンドルへの正しいパスを指定する必要があります。
34    curl_setopt($curlHandle, CURLOPT_CAINFO, '/path/to/nonexistent/ca-bundle.pem');
35
36    echo "CURLリクエストを '" . $targetUrl . "' へ実行中...\n";
37
38    // CURLリクエストの実行
39    $response = curl_exec($curlHandle);
40
41    // curl_exec() が false を返した場合、リクエスト中にエラーが発生しています。
42    if ($response === false) {
43        // curl_errno() 関数を使ってCURLエラーコードを取得
44        $errorCode = curl_errno($curlHandle);
45        // curl_error() 関数を使ってCURLエラーメッセージを取得
46        $errorMessage = curl_error($curlHandle);
47
48        echo "CURLリクエスト中にエラーが発生しました。\n";
49        echo "エラーコード: " . $errorCode . "\n";
50        echo "エラーメッセージ: " . $errorMessage . "\n";
51
52        // 取得したエラーコードが 77 (CURLE_SSL_CACERT) であるかを確認
53        if ($errorCode === 77) {
54            echo "\n>>> エラーコード '77' (CURLE_SSL_CACERT) が検出されました。\n";
55            echo "このエラーは、CURLがリモートサーバーのSSL証明書を、\n";
56            echo "指定されたCA証明書リストで検証できなかった場合に発生します。\n";
57            echo "このサンプルでは、意図的に無効なCA証明書パスを設定しているため、このエラーが発生しています。\n";
58            echo "通常は、php.iniで 'curl.cainfo' を設定するか、CURLOPT_CAINFOに正しいパスを指定することで解決します。\n";
59        } else {
60            echo "\nエラーコード 77 (CURLE_SSL_CACERT) 以外のCURLエラーが発生しました。\n";
61        }
62    } else {
63        // エラーが発生しなかった場合の処理 (このサンプルでは稀なケース)
64        echo "CURLリクエストはエラーなく完了しました。(この設定では通常はエラーになることが想定されます。)\n";
65        // 取得したレスポンスの最初の部分を表示
66        // echo "レスポンスの最初の100文字:\n" . substr($response, 0, 100) . "...\n";
67    }
68
69    // CURLハンドルを閉じ、システムリソースを解放します。
70    curl_close($curlHandle);
71}
72
73// 関数を実行して、動作を確認します。
74demonstrateCurlErrnoError77();
75

curl_errno関数は、PHPでCURLリクエストを実行した際に発生したエラーの数値コードを取得するために使用されます。この関数は引数として、エラーコードを知りたいCURLリクエストのCurlHandle(CURLリソース)を受け取ります。そして、エラーの種類を示す整数値を戻り値として返します。

このサンプルコードでは、curl_initでCURLハンドルを初期化した後、CURLOPT_CAINFOオプションに存在しないCA証明書ファイルのパスを意図的に設定しています。これにより、curl_execの実行時にSSL証明書の検証に失敗するエラーを発生させています。curl_execが失敗した際にcurl_errno関数を呼び出すことで、特定のエラーコード「77」を捕捉し、その内容を表示しています。エラーコード「77」はCURLE_SSL_CACERTを示しており、CURLがリモートサーバーのSSL証明書を指定されたCA証明書リストで検証できなかった場合に発生します。

システムエンジニアを目指す初心者の方にとって、このようにcurl_errno関数を用いて特定のエラーコードを正確に検出し、そのエラーが何を示しているかを理解することは、ネットワーク通信を伴うアプリケーションのデバッグと問題解決において非常に重要です。エラーコードに基づいて適切な対応を行うことで、アプリケーションの安定性と信頼性を向上させることができます。

このサンプルコードは学習目的で、CURLOPT_CAINFOに無効なパスを指定することで、意図的にエラーコード77(SSL証明書の検証失敗)を発生させています。本番環境では、必ず有効なCA証明書のパスを指定するか、php.inicurl.cainfoを正しく設定し、SSL検証が適切に行われるようにしてください。これはセキュリティ上極めて重要です。curl_errno関数はcurl_execfalseを返した後に使用し、エラーコードを取得します。エラー原因の特定には、curl_error関数による詳細なエラーメッセージの取得も併用すると効果的です。処理の終了時には、curl_closeでCURLハンドルを閉じ、リソースを適切に解放してください。

関連コンテンツ

関連プログラミング言語