【PHP8.x】curl_setopt関数の使い方

作成日: 更新日:

curl_setopt関数は、PHPのcURL拡張機能を用いてネットワーク通信を行う際に、その通信の詳細なオプションを設定するために使用される関数です。cURLは、ウェブサーバーへのリクエスト送信など、プログラムからネットワーク通信を行うための強力なライブラリであり、PHPでは外部のAPIとの連携やウェブサイトのコンテンツ取得によく用いられます。

この関数を使うことで、特定のcURLセッションに対して、接続先のURLやHTTPリクエストメソッド、送信するデータ、タイムアウト時間、認証情報など、様々な挙動を細かく指定することができます。具体的には、まずcurl_init()関数で初期化されたcURLセッションハンドルと、設定したいオプションの種類を示す定数、そしてそのオプションに設定する値を引数として受け取ります。これにより、次にcurl_exec()関数で実際の通信が実行される際に、あらかじめ設定されたオプションに基づいて正確な処理が行われるようになります。

例えば、特定のURLへのアクセス、リクエストヘッダーの追加、HTTPS接続時のSSL検証の制御、POSTデータの送信など、多岐にわたる設定が可能です。ネットワーク通信における細かな制御を可能にし、堅牢で柔軟なアプリケーションを開発するために不可欠な関数です。設定が成功した場合はtrue、失敗した場合はfalseを返します。

基本的な使い方

構文(syntax)

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");
curl_close($ch);
?>

引数(parameters)

CurlHandle $handle, int $option, mixed $value

  • CurlHandle $handle: 操作対象のcURLセッションを表すハンドラ
  • int $option: 設定したいオプションの定数
  • mixed $value: $optionで指定したオプションに設定する値

戻り値(return)

bool

curl_setopt関数は、指定されたcURLセッションのオプションを設定します。処理が成功した場合はTRUEを、失敗した場合はFALSEを返します。

サンプルコード

PHP cURLで一括設定しコンテンツ取得

<?php

/**
 * cURLリクエストを実行し、指定されたURLからコンテンツを取得するサンプル関数。
 * curl_setopt_array を使用して複数のcURLオプションを一度に設定する方法を示します。
 *
 * @param string $url 取得するWebページのURL。
 * @return string|false 成功した場合は取得したコンテンツ、失敗した場合はfalse。
 */
function fetchWebPageContent(string $url): string|false
{
    // cURLセッションを初期化します。
    // CurlHandleオブジェクトを返します。失敗した場合はfalse。
    $ch = curl_init();

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

    // curl_setopt_array に渡すオプションを連想配列で定義します。
    // キーはCURLOPT_*定数、値は設定したい値です。
    $options = [
        CURLOPT_URL            => $url,              // リクエストを送信するURL。
        CURLOPT_RETURNTRANSFER => true,              // 実行結果を文字列で返すように設定 (echoせずに関数の戻り値にする)。
        CURLOPT_TIMEOUT        => 30,                // 接続タイムアウト (秒)。
        CURLOPT_FOLLOWLOCATION => true,              // リダイレクトを自動的に追跡する。
        CURLOPT_MAXREDIRS      => 5,                 // 追跡するリダイレクトの最大数。
        CURLOPT_SSL_VERIFYPEER => false,             // SSL証明書の検証を無効にする (開発環境での一時的な設定。本番環境ではtrueに推奨)。
        CURLOPT_USERAGENT      => 'PHP cURL Client', // ユーザーエージェントを設定。
    ];

    // curl_setopt_array を使用して、上記で定義したオプションを一括で設定します。
    // 成功した場合はtrue、失敗した場合はfalseを返します。
    if (!curl_setopt_array($ch, $options)) {
        echo "cURLオプションの設定に失敗しました: " . curl_error($ch) . "\n";
        curl_close($ch); // エラー発生時もクローズを忘れずに。
        return false;
    }

    // cURLセッションを実行し、結果を取得します。
    // CURLOPT_RETURNTRANSFER がtrueの場合、結果は文字列として返されます。
    // 失敗した場合はfalse。
    $response = curl_exec($ch);

    // cURLの実行中にエラーが発生したか確認します。
    if (curl_errno($ch)) {
        // エラーメッセージとエラーコードを表示します。
        echo 'cURLエラー (' . curl_errno($ch) . '): ' . curl_error($ch) . "\n";
        $response = false; // エラーが発生したため、結果をfalseに設定。
    }

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

    return $response;
}

// サンプルとして、Googleのトップページを取得してみましょう。
$targetUrl = "https://www.google.com";
echo "指定されたURLからコンテンツを取得中: {$targetUrl}\n";

$content = fetchWebPageContent($targetUrl);

if ($content !== false) {
    echo "コンテンツの取得に成功しました。先頭100文字:\n";
    echo substr($content, 0, 100) . "...\n";
    echo "コンテンツの長さ: " . strlen($content) . " バイト\n";
} else {
    echo "コンテンツの取得に失敗しました。\n";
}

echo "\n--- 存在しないURLでのエラー例 ---\n";
$invalidUrl = "https://this-is-an-invalid-domain-12345.com";
echo "存在しないURLからコンテンツを取得中: {$invalidUrl}\n";
$errorContent = fetchWebPageContent($invalidUrl);
if ($errorContent === false) {
    echo "期待通り、コンテンツの取得に失敗しました (エラー処理が機能)。\n";
}

?>

PHPのcurl_setopt関数は、外部のWebサイトなどと通信するための機能であるcURLの動作を細かく設定する際に使用します。この関数は、curl_init()で作成されたcURLセッション(CurlHandle型)に対し、設定したい項目を示す定数(int $option)とその値(mixed $value)を指定することで、様々な動作をカスタマイズします。設定が成功した場合はtrue、失敗した場合はfalseを戻り値として返します。

サンプルコードでは、複数のオプションを一度に設定できるcurl_setopt_array関数を活用しています。これは、curl_setoptを複数回呼び出す代わりに、オプション名と設定値をキーとバリューとする連想配列としてまとめて渡し、効率的にcURLの設定を行うためのものです。具体的には、リクエスト先のURL (CURLOPT_URL)、実行結果を文字列として取得するか (CURLOPT_RETURNTRANSFER)、タイムアウト時間 (CURLOPT_TIMEOUT)、リダイレクトを追跡するか (CURLOPT_FOLLOWLOCATION) などの設定を一括で行っています。特にCURLOPT_SSL_VERIFYPEER => falseはSSL証明書の検証を無効にするもので、開発環境では便利ですが、本番環境ではセキュリティ上の理由からtrueに設定することが強く推奨されます。

一連の処理では、curl_init()でセッションを開始し、curl_setopt_array()で設定、curl_exec()でリクエストを実行し、最後にcurl_close()でセッションを確実に閉じてリソースを解放する流れが示されています。エラー発生時のメッセージ表示やセッションのクローズといった適切なエラーハンドリングも含まれており、安定した外部通信を行うための基本的なパターンを学ぶことができます。

このサンプルコードでは、curl_init()で初期化したcURLリソースを、処理の完了後やエラー発生時にも必ずcurl_close()で閉じ、リソースの解放を行うことが重要です。これはメモリリーク防止に不可欠な処理です。また、curl_init()curl_setopt_array()curl_exec()の各処理でエラーが発生する可能性があるため、戻り値を常に確認し、curl_errno()curl_error()を使用して詳細なエラー情報を取得し、適切に処理してください。

特に注意すべきはCURLOPT_SSL_VERIFYPEER => falseの設定です。これはSSL証明書の検証を無効にするため、本番環境ではセキュリティリスクとなり得ます。開発環境での一時的なテスト目的以外では、必ずtrueに設定し、HTTPS通信の安全性を確保してください。CURLOPT_RETURNTRANSFER => trueは、curl_exec()の実行結果を文字列として受け取り、プログラム内で扱うために不可欠なオプションです。curl_setopt_arrayを使用すると、複数のcURLオプションを一括で設定でき、コードを簡潔に保てます。

PHP cURLでGETリクエストする

<?php

declare(strict_types=1);

/**
 * 指定されたURLにGETリクエストを送信し、レスポンスボディを取得します。
 *
 * @param string $url 取得対象のURL
 * @return string|false 成功した場合はレスポンスボディ、失敗した場合はfalse
 */
function getContentViaGet(string $url): string|false
{
    // 1. cURLセッションを初期化
    // curl_init() は cURL ハンドル (CurlHandle オブジェクト) を返します。
    $ch = curl_init();
    if ($ch === false) {
        return false;
    }

    // 2. curl_setopt() を使ってcURLの転送オプションを設定
    // オプション1: 取得するURLを指定します。
    curl_setopt($ch, CURLOPT_URL, $url);

    // オプション2: curl_exec() の結果を文字列として返すように設定します。
    // これを true にしないと、結果が直接ブラウザに出力されてしまいます。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // GETリクエストはcURLのデフォルト動作なので、メソッドを明示的に指定する必要はありません。

    // 3. cURLセッションを実行し、レスポンスを取得します。
    $response = curl_exec($ch);

    // 4. エラーチェック (本番環境ではエラーログに出力することを推奨)
    if ($response === false) {
        // 例: error_log('cURL Error: ' . curl_error($ch));
    }

    // 5. cURLセッションを終了し、リソースを解放します。
    curl_close($ch);

    return $response;
}

// --- 実行例 ---

// テスト用の公開APIエンドポイント
$targetUrl = 'https://jsonplaceholder.typicode.com/posts/1';

echo "Fetching content from: {$targetUrl}" . PHP_EOL;

$content = getContentViaGet($targetUrl);

if ($content !== false) {
    echo "--- Response ---" . PHP_EOL;
    print_r($content);
    echo PHP_EOL;
} else {
    echo "Failed to fetch content." . PHP_EOL;
}

PHPのcurl_setopt関数は、HTTP通信を行うcURL拡張機能において、転送オプションを設定するために使用される重要な関数です。この関数は、curl_init()で初期化したcURLハンドル、設定したいオプションを示す定数、そしてそのオプションに設定する値の三つの引数を取ります。設定が成功するとtrueを、失敗するとfalseを戻り値として返します。

提示されたサンプルコードは、特定のURLにGETリクエストを送信し、その応答(レスポンスボディ)を文字列として取得するgetContentViaGet関数を実装しています。この関数では、まずcurl_init()でcURLセッションを開始し、その後にcurl_setopt()を二度呼び出しています。一度目のcurl_setopt()では、CURLOPT_URLオプションを使用して通信先のURLを設定します。二度目のcurl_setopt()では、CURLOPT_RETURNTRANSFERオプションをtrueに設定することで、curl_exec()関数の実行結果が直接出力されるのではなく、戻り値として文字列で返されるように指定しています。これにより、取得したレスポンスをプログラム内で自由に処理できるようになります。これらのオプション設定の後、curl_exec()でリクエストを実行し、最終的にcurl_close()でリソースを解放することで、安全かつ効率的なHTTP通信を実現しています。

curl_setopt関数は、cURLの挙動を細かく制御するための重要な設定を行います。特にCURLOPT_RETURNTRANSFERtrueに設定しないと、curl_execの実行結果が変数に代入されず、直接出力されてしまうため注意が必要です。また、curl_initcurl_execが失敗した際にfalseが返されるため、適切なエラーハンドリングを行い、curl_error()で詳細なエラー情報を確認できるようにすることが重要ですし、本番環境ではエラーログに出力することを推奨します。リソースの解放忘れはシステムに負担をかける原因となるため、処理の最後には必ずcurl_close()でセッションを閉じることを習慣づけましょう。このサンプルではGETリクエストのため明示的なメソッド指定は不要ですが、POSTなどの場合は追加のオプション設定が必要です。

PHPでSSL証明書を無視してURLを取得する

<?php

/**
 * 指定されたURLからコンテンツを取得します。
 * この関数はSSL証明書の検証を無効にします。
 * これはセキュリティ上のリスクがあるため、本番環境での使用は推奨されません。
 * 主に開発環境や、検証できないが信頼できる内部システムへの接続で一時的に使用されることがあります。
 *
 * @param string $url 取得するURL。
 * @return string|false 成功した場合はURLのコンテンツ、失敗した場合はfalse。
 */
function fetchUrlIgnoringSsl($url): string|false
{
    // cURLセッションを初期化します。
    $ch = curl_init();

    // cURLの初期化に失敗した場合、エラーメッセージを出力し、falseを返します。
    if ($ch === false) {
        echo "エラー: cURLの初期化に失敗しました。\n";
        return false;
    }

    // cURLオプションを設定します。
    // アクセスするターゲットURLを設定します。
    curl_setopt($ch, CURLOPT_URL, $url);
    // curl_exec()が実行結果を文字列として返すように設定します。
    // trueに設定しない場合、curl_exec()は直接結果を出力します。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // ====== ここが「証明書を無視する」ための重要な設定です ======

    // サーバーのSSL証明書の正当性を検証しないように設定します。
    // これにより、自己署名証明書や期限切れの証明書を持つサーバーにも接続できるようになります。
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    // ホスト名がSSL証明書のコモンネーム(CN)と一致するかを検証しないように設定します。
    // CURLOPT_SSL_VERIFYPEERがfalseの場合、この設定は多くの場合、必須ではありませんが、
    // 「証明書を完全に無視する」という意図を明確にするために設定します。
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    // =========================================================

    // cURLセッションを実行し、URLのコンテンツを取得します。
    $response = curl_exec($ch);

    // cURLの実行中にエラーが発生した場合、エラーメッセージを出力します。
    if ($response === false) {
        echo "エラー: cURL実行中に問題が発生しました。\n";
        echo "詳細: " . curl_error($ch) . "\n";
    }

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

    return $response;
}

// -----------------------------------------------------------------
// サンプルコードの使用例
// -----------------------------------------------------------------

// テスト用のURLを設定します。
// badssl.comは、様々なSSL/TLS証明書のテストに使える便利なサイトです。
// 例えば、期限切れの証明書を持つサイト:
$targetUrl = "https://expired.badssl.com/";
// 自己署名証明書を持つサイト:
// $targetUrl = "https://self-signed.badssl.com/";

echo "指定されたURL (" . $targetUrl . ") のコンテンツ取得を試みます...\n";

// 関数を呼び出してコンテンツを取得します。
$content = fetchUrlIgnoringSsl($targetUrl);

// 取得結果を表示します。
if ($content !== false) {
    echo "コンテンツの取得に成功しました (最初の200文字):\n";
    echo substr($content, 0, 200) . "...\n";
} else {
    echo "コンテンツの取得に失敗しました。\n";
}

?>

curl_setopt関数は、PHPで外部のURLにHTTPリクエストを送信する際に使用するcURLセッションの様々な動作を設定するための重要な関数です。引数として、まずcurl_init()で取得したcURLセッションのハンドル$handleを受け取ります。次に、設定したいオプションを示す整数値$optionを指定し、そのオプションに設定する値$valueを渡します。この関数の戻り値は、設定が成功したかどうかを示す真偽値(bool)です。

このサンプルコードでは、特にセキュリティに関連する重要な設定について説明しています。通常、HTTPS通信を行う際には、接続先のサーバーが提示するSSL証明書が正規のものであるか、また、アクセスしようとしているホスト名と証明書の内容が一致しているかを厳密に検証します。しかし、開発環境や特定の内部システムでは、自己署名証明書など、正規の検証プロセスではエラーとなる証明書を使用することがあります。

そのような場合に、curl_setopt関数を用いてCURLOPT_SSL_VERIFYPEERfalseに設定することで、サーバー証明書の正当性検証を無効化します。さらに、CURLOPT_SSL_VERIFYHOSTfalseに設定することで、証明書のコモンネーム(CN)とホスト名の一致検証も行わないようにできます。これにより、証明書のエラーを無視して接続が可能になります。

ただし、これらの設定はセキュリティ上のリスクを伴うため、本番環境での使用は推奨されません。主に開発やテスト用途での一時的な利用に限定すべきです。他にも、アクセスするURLをCURLOPT_URLで指定したり、curl_exec()の実行結果を文字列として受け取るためにCURLOPT_RETURNTRANSFERtrueに設定するなど、基本的なcURLの動作もcurl_setoptで制御します。コード全体では、cURLセッションの初期化、各種設定、実行、そして終了までの一連の処理とエラーハンドリングが実装されています。

このサンプルコードは、curl_setopt関数でCURLOPT_SSL_VERIFYPEERCURLOPT_SSL_VERIFYHOSTfalseに設定することで、SSL証明書の検証を無効にする方法を示しています。この設定により、自己署名証明書や期限切れの証明書を持つサーバーにも接続できるようになりますが、セキュリティ上の重大なリスクを伴います。通信の正当性が保証されなくなり、中間者攻撃などのセキュリティ脅威にさらされる可能性が高まります。そのため、本番環境での使用は絶対に避けてください。開発環境での一時的なテストや、検証できないが信頼できる内部システムへの接続など、極めて限定的な状況でのみ利用を検討してください。常にSSL証明書を適切に設定し、検証を有効にすることが安全なシステム運用の基本です。

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