現在の位置: ホーム> 最新記事一覧> 1つのスクリプトでcurl_closeを使用して複数の同時リクエストを終了する方法は?

1つのスクリプトでcurl_closeを使用して複数の同時リクエストを終了する方法は?

gitbox 2025-05-26

Curlは、PHPを使用して同時HTTP要求を処理する場合、非常に一般的で強力なツールです。効率を向上させるために、通常、 curl_multi_*一連の関数を使用して、複数の同時リクエストを開始します。すべてのリクエストを完了した後、各リクエストハンドルを正しく閉じることが非常に重要です。これはまさにcurl_close()が行うことです。この記事では、PHPスクリプトでcurl_multi_exec()を使用してcurl_close ()を使用して複数の同時リクエストを終了する方法について詳しく説明します。

基本準備:複数のリクエストを開始します

まず、複数のCurlハンドルを作成し、 curl_multi_add_handle()を介してマルチハンドルリソースに追加する必要があります。

 $urls = [
    "https://gitbox.net/api/service1",
    "https://gitbox.net/api/service2",
    "https://gitbox.net/api/service3"
];

$multiHandle = curl_multi_init();
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[] = $ch;
}

このコードでは、3つのURLを3つの個別のCurl要求ハンドルとして追加し、マルチハンドルリソース$ MultiHandleに追加します。

同時リクエストを実行します

すべてのハンドルを追加した後、 curl_multi_exec()およびcurl_multi_select()を介してこれらの要求の実行を処理します。

 $running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

このループは、すべての同時リクエストが完了するまで実行され続けます。 curl_multi_exec()は実際にリクエストを開始しますが、 curl_multi_select()は、CPUアイドルを回避するためにアクティブな接続を待つために使用されます。

応答コンテンツを取得する(オプション)

実行が完了したら、各リクエストの結果を取得することをお勧めします。

 $responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
}

ハンドルを閉じます:curl_close()を使用します

リクエストが完了したら、各カールリクエストハンドルとマルチハンドルリソース自体を含むすべてのリソースがリリースされるようにする必要があります。これは、curl_close()が出てくる場所です。

 foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

curl_multi_close($multiHandle);

上記のコードでは、 curl_multi_remove_handle()を1つずつ使用して、各ハンドルリソースから各ハンドルを削除し、 curl_close()を使用して閉じ、最後にマルチハンドルリソース自体を閉じます。

まとめ

curl_close()を使用してリソースを正しくリリースすることは、同時リクエストを処理した後に無視できないステップです。以下は、処理プロセスの完全な要約です。

  1. 複数のカール要求ハンドルを初期化します。

  2. マルチハンドルリソースにハンドルを追加します。

  3. curl_multi_exec()を使用して、同時リクエストを処理します。

  4. curl_multi_getContent()を使用して結果(オプション)を取得します。

  5. curl_close()およびcurl_multi_close()を使用して、すべてのハンドルとリソースを閉じます。

上記の方法により、システムリソースが無駄にならないように、単一のPHPスクリプトで複数の同時リクエストを効率的かつ優雅に管理できます。