ネットワーク・HTTP・セキュリティ

PHP curl_execの基本的な使い方とエラー処理について解説

PHPでHTTP通信を行う際に欠かせないcURLライブラリの基本関数であるcurl_execについて解説します。

curl_execはcURLセッションで送信したリクエストの結果を受け取るために用いられ、外部APIとの連携やWebサイトからのデータ取得に活用されます。

基本的な使い方やエラー処理のポイントについて、わかりやすく紹介します。

cURLセッションの初期化設定

PHPで外部のリソースにアクセスする際、cURLを用いてHTTPリクエストを送る処理は頻繁に利用されます。

このセクションでは、cURLのセッションを初期化する方法について説明します。

curl_init()の利用

cURLセッションはまずcurl_init()を利用して初期化されます。

この関数はセッションハンドラを返すため、後続の処理で利用します。

URLの設定方法

URLの設定は、curl_init()でセッションハンドラを得たあと、curl_setopt()を使って設定することが一般的です。

以下のサンプルコードでは、特定のURLに対してリクエストを送る基本的な設定方法を示しています。

<?php
// セッションハンドラの初期化
$ch = curl_init();
// アクセス先のURLを指定
$url = "https://example.com/api/data";
curl_setopt($ch, CURLOPT_URL, $url);
// レスポンスの返却を有効にする(出力を直接表示しない)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// APIからのレスポンスを変数に格納
$response = curl_exec($ch);
// エラーがある場合は出力(デバッグ用)
if ($response === false) {
    // エラー番号とエラーメッセージを出力
    echo "エラー番号: " . curl_errno($ch) . "\n";
    echo "エラーメッセージ: " . curl_error($ch) . "\n";
} else {
    echo "レスポンス: " . $response;
}
// セッションの終了
curl_close($ch);
?>
レスポンス: {実際のAPIからの返却内容}

ヘッダーやリクエストパラメータの指定

リクエストヘッダーやパラメータの設定は、curl_setopt()CURLOPT_HTTPHEADERオプションやCURLOPT_POSTFIELDSオプションで行います。

下記のサンプルコードでは、JSON形式のデータをPOSTリクエストで送信する例を示します。

<?php
// セッションハンドラの初期化
$ch = curl_init();
// アクセス先のURLを指定
$url = "https://example.com/api/submit";
curl_setopt($ch, CURLOPT_URL, $url);
// リクエストヘッダーの設定(JSON形式)
$headers = [
    "Content-Type: application/json",
    "Accept: application/json"
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// POSTリクエストを有効に設定
curl_setopt($ch, CURLOPT_POST, true);
// 送信するパラメータをJSON形式で設定
$data = json_encode(["key" => "値"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// レスポンスの返却を有効に設定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// リクエストの実行
$response = curl_exec($ch);
// 結果またはエラーの出力
if ($response === false) {
    echo "エラー番号: " . curl_errno($ch) . "\n";
    echo "エラーメッセージ: " . curl_error($ch) . "\n";
} else {
    echo "レスポンス: " . $response;
}
// セッションの終了
curl_close($ch);
?>
レスポンス: {実際のAPIからの返却内容}

オプションの設定

cURLでは各種のオプションを設定することが可能です。

ここでは主にタイムアウトや接続のオプションと、SSLに関するオプションの調整について説明します。

タイムアウトや接続オプション

リクエストが長時間停止した場合に備え、タイムアウトや接続時間の設定は重要です。

代表的なオプションとしては、CURLOPT_TIMEOUTCURLOPT_CONNECTTIMEOUTがあります。

以下では、接続にかかる時間と全体の実行時間を制限する方法を示します。

<?php
$ch = curl_init();
$url = "https://example.com/api/data";
curl_setopt($ch, CURLOPT_URL, $url);
// レスポンスを変数へ保存する設定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 接続までのタイムアウトの設定(秒)
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
// 全体のリクエストタイムアウトの設定(秒)
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
// タイムアウトなどのエラー確認
if ($response === false) {
    echo "エラー番号: " . curl_errno($ch) . "\n";
    echo "エラーメッセージ: " . curl_error($ch) . "\n";
} else {
    echo "レスポンス: " . $response;
}
curl_close($ch);
?>
レスポンス: {実際のAPIからの返却内容}

SSL設定の調整

SSL通信を行う場合、サーバーの証明書検証に関する設定が利用されます。

テスト環境などで検証を行わない場合は、証明書の検証を無効にすることができます。

ただし、本番環境では証明書検証を有効にすることが推奨されています。

<?php
$ch = curl_init();
$url = "https://example.com/secure-api";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// SSL証明書の検証を無効に設定(テスト環境のみ推奨)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
if ($response === false) {
    echo "エラー番号: " . curl_errno($ch) . "\n";
    echo "エラーメッセージ: " . curl_error($ch) . "\n";
} else {
    echo "レスポンス: " . $response;
}
curl_close($ch);
?>
レスポンス: {実際のAPIからの返却内容}

curl_exec()の動作と結果取得

cURLのリクエストを実行する際は、curl_exec()を利用します。

この関数は、リクエストを実行し、返り値として結果を返します。

返り値の取得方法や出力内容の管理方法について、以下で説明します。

実行処理の流れ

リクエストの実行は、先に設定済みのセッションでcurl_exec()を呼び出すことで行われます。

実行後、レスポンスデータやエラー情報を確認する必要があります。

返り値の取得方法

curl_exec()は、レスポンスデータを返し、データを直接出力しないようにするには、CURLOPT_RETURNTRANSFERオプションを有効に設定します。

サンプルコードでは、変数に結果を格納する方法を示しています。

<?php
// cURLセッションの初期化と基本設定
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// リクエストの実行と結果取得
$response = curl_exec($ch);
// 結果の変数確認
if ($response !== false) {
    echo "取得したデータ: " . $response;
}
?>
取得したデータ: {実際のレスポンスデータ}

出力内容の取り扱い

取得したレスポンスは、文字列やJSON形式の場合が多いです。

特定の形式に合わせた処理(例えば、JSONのデコードなど)を行うと利用しやすくなります。

以下のサンプルでは、レスポンスがJSONの場合の取り扱いを示します。

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/json-data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response !== false) {
    // 取得したJSON文字列を配列に変換
    $data = json_decode($response, true);
    // 配列の内容を表示
    print_r($data);
} else {
    echo "データの取得に失敗しました。";
}
curl_close($ch);
?>
Array
(
    [key] => 値
    [another_key] => 別の値
)

結果確認とエラー検出

curl_exec()の返り値がfalseの場合、エラーが発生したと判断し、エラー情報を参照する必要があります。

curl_error()とcurl_errno()の使用法

エラー発生時には、curl_error()でエラーメッセージ、curl_errno()でエラー番号を取得できます。

これらの関数を利用することで、トラブルシューティングがしやすくなります。

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
// エラー情報の取得
$errorMsg = curl_error($ch);
$errorNo = curl_errno($ch);
if ($result === false) {
    echo "エラー番号: " . $errorNo . "\n";
    echo "エラーメッセージ: " . $errorMsg . "\n";
} else {
    echo "レスポンス: " . $result;
}
curl_close($ch);
?>
エラー番号: 7
エラーメッセージ: Failed to connect to example.com port 443: Connection timed out

エラー発生時の処理手順

エラーが発生した際には、エラーログの出力やリトライ処理、または代替処理を行うといった対応が考えられます。

以下のコードは、単純なリトライロジックを実装した例です。

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$maxRetries = 3;
$attempt = 0;
$response = false;
while ($attempt < $maxRetries && $response === false) {
    $response = curl_exec($ch);
    if ($response === false) {
        echo "試行 " . ($attempt + 1) . " 回目でエラー発生: " . curl_error($ch) . "\n";
        $attempt++;
        // リトライ前に少し待機(1秒)
        sleep(1);
    }
}
if ($response !== false) {
    echo "最終的なレスポンス: " . $response;
}
curl_close($ch);
?>
試行 1 回目でエラー発生: 接続タイムアウト
試行 2 回目でエラー発生: 接続タイムアウト
最終的なレスポンス: {実際のAPIからの返却内容}

セッション終了とリソース管理

cURLの処理が完了した後は、セッションを正しく終了し、使用していたリソースの解放を行うことが重要です。

セッションを終了することで、システムリソースの無駄遣いやメモリリークを防ぐことができます。

curl_close()の使用方法

セッションが不要になった場合、curl_close()を利用してセッションを終了する必要があります。

使用例を以下に示します。

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// レスポンスやエラー処理をここで実施
// セッションの終了
curl_close($ch);
// その他の処理を続ける
echo "処理が完了しました。";
?>
処理が完了しました。

セッション終了のタイミング

リクエストの実行完了後、エラー確認やレスポンスデータの処理を全て実施した段階でセッションを終了します。

再利用の必要がない場合は、タイミングを逃さずに終了することで、システムリソースの節約につながります。

リソース解放のポイント

長時間または繰り返しcURLを利用するアプリケーションでは、各リクエスト後にcurl_close()を呼ぶように心がけます。

適切なリソース管理はアプリケーション全体のパフォーマンス向上に寄与します。

必要以上のリソース保持がないよう、処理終了後は必ずセッションを閉じる習慣を付けることが望ましいです。

まとめ

本文では、cURLセッションの初期化、実行、エラー確認とリソース管理の方法について具体例を交えて解説しました。

全体として、実践的なcURLの使い方が理解でき、設定オプションやエラー処理の流れが整理されました。

ぜひ、今回の内容を活用して自分のプロジェクトでcURLの実装に挑戦してみてください。

関連記事

Back to top button
目次へ