【PHP8.x】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)

<?php
$curlHandle = curl_init();
$errorCode = curl_errno($curlHandle);
?>

引数(parameters)

CurlHandle $handle

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

戻り値(return)

int

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

サンプルコード

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

<?php

/**
 * cURLのタイムアウトエラー(コード28)を意図的に発生させ、
 * curl_errno関数の使い方を示すサンプルコードです。
 *
 * この関数は、短いタイムアウト設定でWebサイトへのアクセスを試み、
 * 発生したcURLエラーコードとそのメッセージを表示します。
 * 特に、キーワード「28」が示すタイムアウトエラーの検出に焦点を当てています。
 */
function demonstrateCurlErrnoForTimeoutError(): void
{
    // cURLセッションを初期化します。成功するとCurlHandleオブジェクトを返します。
    $ch = curl_init();

    if ($ch === false) {
        echo "cURLセッションの初期化に失敗しました。\n";
        return;
    }

    // アクセス対象のURLを設定します。
    // 短いタイムアウトを設定することで、実在するWebサイトでもタイムアウトエラーを誘発しやすくなります。
    curl_setopt($ch, CURLOPT_URL, "http://example.com");

    // 転送結果を文字列として返すように設定します。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // タイムアウトを1秒に設定します。
    // これにより、応答が1秒以内にない場合にエラーコード28 (CURLE_OPERATION_TIMEDOUT) が発生しやすくなります。
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);

    echo "cURLリクエストを開始します... (タイムアウト設定: 1秒)\n";

    // cURLセッションを実行し、結果を取得します。
    $response = curl_exec($ch);

    // curl_exec()がfalseを返した場合、エラーが発生しています。
    if ($response === false) {
        // curl_errno()関数を使って、発生したエラーの数値コードを取得します。
        // 引数にはCurlHandleオブジェクトを渡します。戻り値はint型です。
        $errorCode = curl_errno($ch);

        // curl_error()関数を使って、エラーの具体的なメッセージを取得します。
        $errorMessage = curl_error($ch);

        echo "cURLエラーが発生しました。\n";
        echo "エラーコード: " . $errorCode . "\n";
        echo "エラーメッセージ: " . $errorMessage . "\n";

        // 取得したエラーコードが28かどうかをチェックします。
        if ($errorCode === 28) {
            echo ">>> これは操作がタイムアウトしたことを示すエラーです (CURLE_OPERATION_TIMEDOUT)。 <<<\n";
            echo "指定された時間内にサーバーからの応答がなかった可能性があります。\n";
        } else {
            echo "その他のcURLエラーが発生しました。このコードは28ではありません。\n";
        }
    } else {
        echo "cURLリクエストは成功しました。\n";
        echo "応答の長さ: " . strlen($response) . "バイト\n";
        // 必要に応じて応答内容の一部を表示できます。
        // echo "応答内容のプレビュー: " . substr($response, 0, 200) . "...\n";
    }

    // cURLセッションを閉じ、リソースを解放します。
    curl_close($ch);
}

// 上記で定義した関数を実行します。
demonstrateCurlErrnoForTimeoutError();

?>

このサンプルコードは、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 エラー番号 7 を取得する

<?php

/**
 * cURLリクエストを実行し、エラーが発生した場合はその情報を表示する関数。
 * 特に「curl_errno 7」(ホストに接続できません)のようなネットワークエラーを
 * 意図的に発生させる例として、存在しないドメインへのリクエストを試みます。
 */
function demonstrateCurlErrno(): void
{
    // cURLセッションを初期化
    $ch = curl_init();

    // 存在しないドメインを指定し、意図的に接続エラーを発生させる
    // これにより「curl_errno 7」(Couldn't connect to host)が発生する可能性が高い
    $url = "http://this-domain-will-not-exist.invalid/";
    curl_setopt($ch, CURLOPT_URL, $url);

    // cURLが取得したデータを直接出力せず、文字列として返すように設定
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // タイムアウト時間を短く設定し、エラーを早く検出させる (オプション)
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 接続タイムアウト
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);     // 実行タイムアウト

    echo "指定URL: " . $url . "\n";
    echo "cURLリクエストを実行中...\n";

    // cURLリクエストを実行
    curl_exec($ch);

    // cURL操作で発生したエラー番号を取得
    $error_no = curl_errno($ch);

    // エラー番号が0でない場合はエラーが発生している
    if ($error_no !== 0) {
        // エラー番号と対応するエラーメッセージを表示
        echo "cURLエラーが発生しました。\n";
        echo "エラー番号: " . $error_no . "\n";
        echo "エラーメッセージ: " . curl_strerror($error_no) . "\n";
        echo "このエラーは通常、指定されたホストが存在しないか、\n";
        echo "ネットワークに到達できない場合に発生します。\n";
    } else {
        echo "cURLリクエストはエラーなしで完了しました。\n";
        // 成功時の処理をここに記述
    }

    // cURLセッションを閉じる
    curl_close($ch);
}

// 関数を実行
demonstrateCurlErrno();

?>

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を忘れずに実行してください。また、タイムアウト設定は、無応答状態でのプログラム停止を防ぎ、エラー検出を早める良い実践方法です。

【PHP8.x】curl_errno関数の使い方 | いっしー@Webエンジニア