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

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

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

作成日: 更新日:

基本的な使い方

CURLOPT_FAILONERROR定数は、PHPのcURL拡張機能において、HTTPリクエストの処理中にサーバーからエラー応答があった場合の挙動を制御するために使用される定数です。この定数をtrueに設定すると、Webサーバーから返されるHTTPステータスコードが400番台(クライアントエラー)や500番台(サーバーエラー)である場合に、cURLはその応答をエラーとして扱います。

通常、cURLはHTTPステータスコードがエラーを示すものであっても、サーバーが何らかのコンテンツ(例: エラーページやJSON形式のエラーメッセージ)を返した場合、それを正常なデータとして処理し続けることがあります。しかし、CURLOPT_FAILONERRORを有効にすることで、curl_exec()関数がfalseを返し、開発者がHTTPプロトコルレベルでのエラーを明確に検出できるようになります。これにより、エラー発生時の適切な処理やアプリケーションの堅牢性向上に役立ちます。

具体的なエラーの詳細は、curl_error()関数やcurl_errno()関数を使って確認することができます。ただし、このオプションはあくまでHTTPステータスコードによるエラーにのみ作用し、ネットワーク接続の失敗やDNS解決エラー、タイムアウトなど、HTTPプロトコル層より低いレベルで発生するcURL自体のエラーには影響しない点に注意が必要です。API連携など、Webサービスからの応答を正確にハンドリングしたい場合に非常に有用な定数です。

構文(syntax)

1<?php
2$ch = curl_init("http://example.com");
3curl_setopt($ch, CURLOPT_FAILONERROR, true);
4curl_exec($ch);
5curl_close($ch);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP cURL: CURLOPT_FAILONERROR でエラーを検出する

1<?php
2
3/**
4 * CURLOPT_FAILONERROR の使用例
5 *
6 * このオプションを true に設定すると、HTTPステータスコードが 400 (Bad Request) 以上の場合、
7 * cURL リクエストは失敗とみなされ、curl_exec() は false を返します。
8 * 通常、cURL は HTTP エラーコードを受け取っても成功とみなし、レスポンスボディを返します。
9 *
10 * システムエンジニアを目指す初心者向け:
11 * 外部のAPIやウェブサイトと通信する際、エラーレスポンス(例: 404 Not Found, 500 Internal Server Error)
12 * を受け取った場合に、それを明確な失敗として処理したい場合にこのオプションが役立ちます。
13 */
14function demonstrateCurlFailOnError(): void
15{
16    // 意図的に HTTP 404 エラーを返すテスト用URL
17    // このURLは常に HTTP 404 Not Found ステータスコードを返します。
18    $url = 'https://httpbin.org/status/404';
19
20    echo "CURLOPT_FAILONERROR を有効にした cURL リクエストのデモンストレーション:\n";
21    echo "対象URL: {$url}\n\n";
22
23    // cURL セッションを初期化
24    $ch = curl_init();
25
26    if ($ch === false) {
27        echo "cURL の初期化に失敗しました。\n";
28        return;
29    }
30
31    // オプションを設定
32    curl_setopt($ch, CURLOPT_URL, $url);
33    // レスポンスを文字列として取得(画面に直接出力しない)
34    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
35    // ここが CURLOPT_FAILONERROR の設定箇所
36    // HTTPステータスコードが400以上の場合、curl_exec() を false にする
37    curl_setopt($ch, CURLOPT_FAILONERROR, true);
38
39    // cURL リクエストを実行
40    $response = curl_exec($ch);
41
42    // リクエスト結果をチェック
43    if ($response === false) {
44        // CURLOPT_FAILONERROR が true のため、HTTP 4xx/5xx エラーもここで捕捉されます
45        $errorCode = curl_errno($ch);
46        $errorMessage = curl_error($ch);
47        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
48
49        echo "cURL リクエストが失敗しました。\n";
50        echo "  HTTP ステータスコード: {$httpCode}\n";
51        echo "  cURL エラーコード: {$errorCode}\n";
52        echo "  cURL エラーメッセージ: {$errorMessage}\n";
53    } else {
54        // このブロックは CURLOPT_FAILONERROR が true の場合、
55        // HTTP 2xx/3xx ステータスコードの時のみ実行されます。
56        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
57
58        echo "cURL リクエストが成功しました。\n";
59        echo "  HTTP ステータスコード: {$httpCode}\n";
60        echo "  レスポンスボディの先頭部分:\n";
61        echo "  " . substr($response, 0, 150) . (strlen($response) > 150 ? '...' : '') . "\n";
62    }
63
64    // cURL セッションを閉じる
65    curl_close($ch);
66}
67
68// 関数を実行
69demonstrateCurlFailOnError();
70

CURLOPT_FAILONERRORは、PHPのcURL拡張機能で利用される定数です。この定数をcurl_setopt()関数を通じてtrueに設定することで、cURLリクエストのエラーハンドリングの挙動を変更できます。

通常、cURLはHTTPステータスコードが400番台(クライアントエラー)や500番台(サーバーエラー)であっても、レスポンスボディが返されればcurl_exec()関数を成功とみなし、レスポンスを返します。しかし、CURLOPT_FAILONERRORtrueにすると、HTTPステータスコードが400以上の場合に、curl_exec()falseを返すようになります。これにより、HTTPエラーコードを受け取った場合をcURL操作自体の失敗として、より簡単に処理できるようになります。

この定数自体に引数や戻り値はありませんが、curl_setopt()の第三引数にtrueまたはfalseを指定して設定し、その結果がcurl_exec()関数の戻り値に影響を与えます。

サンプルコードでは、HTTP 404エラーを返すよう設定されたURLに対し、CURLOPT_FAILONERRORtrueにしてcURLリクエストを実行しています。その結果、HTTP 404エラーを受け取った際にcurl_exec()falseを返し、リクエストが明確な失敗として処理される様子を示しています。システムエンジニアを目指す初心者の方にとって、外部のAPIなどと通信する際に、エラーレスポンスを確実に検出して適切なエラー処理を実装するために役立つ重要なオプションです。

CURLOPT_FAILONERRORtrueに設定すると、HTTPステータスコードが400(Bad Request)以上のエラーが発生した場合に、curl_exec()関数がfalseを返すようになります。これにより、外部サービスとの通信でHTTPエラーを明確な失敗として処理でき、エラーハンドリングがしやすくなります。

ただし、curl_exec()falseを返した際には、ネットワーク接続の問題だけでなく、HTTPステータスコードが400以上である可能性も考慮してください。そのため、失敗時にはcurl_getinfo($ch, CURLINFO_HTTP_CODE)で必ず具体的なHTTPステータスコードを確認し、エラーの種類を特定することが重要です。HTTPエラーのレスポンスボディ自体を取得して詳細に解析したい場合は、このオプションは利用せず、HTTPステータスコードで判定する方が適切です。

関連コンテンツ