現在の位置: ホーム> 最新記事一覧> PHPでマルチカールリクエストを適切に処理し、curl_closeで終了する方法は?

PHPでマルチカールリクエストを適切に処理し、curl_closeで終了する方法は?

gitbox 2025-05-18

PHPでは、Curlは、REST APIへのアクセスやクロールするWebページなどのネットワークリクエストを実行するための強力なライブラリです。単一のCurl要求を処理するときは、 curl_init()curl_exec()を使用してハンドルを初期化する標準プロセスであり、リクエストを実行し、最後にcurl_close()を介してリソースをリリースします。ただし、特にcurl_multi_*シリーズ関数を使用する場合、複数の同時リクエストを処理する場合、リソースを適切に閉鎖して清掃することが特に重要です。そうしないと、メモリリークやネットワーク接続の問題につながる可能性があります。

1。基本的なカール要求プロセスのレビュー

単一のリクエストでは、典型的なコードは次のとおりです。

 $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch); // リソースを正しくリリースします

ここでは、 curl_close($ ch)が必要です。 Curl_init()によって作成されたCurlハンドルを閉じ、関連するリソースを解放します。

2。複数のリクエストを処理する一般的な方法

複数のリクエストを同時に開始するために複数の要求が必要なシナリオの場合、PHPはcurl_multi_*インターフェイスを提供します。例は次のとおりです。

 $urls = [
    'https://gitbox.net/api/one',
    'https://gitbox.net/api/two',
    'https://gitbox.net/api/three',
];

$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;
}

// すべてのリクエストを実行します
$running = null;
do {
    curl_multi_exec($multiHandle, $running);
    curl_multi_select($multiHandle);
} while ($running > 0);

// 結果を取得します
$responses = [];
foreach ($curlHandles as $ch) {
    $responses[] = curl_multi_getcontent($ch);
}

この時点で、次のステップCurl_multi_Remove_handlecurl_closeを実行しない場合、リソースはリリースされません。

3.複数の要求されたリソースを正しくリリースします

すべての要求が実行され、応答が取得された後、各ハンドルをクリーニングする必要があります。

 foreach ($curlHandles as $ch) {
    curl_multi_remove_handle($multiHandle, $ch); // から multi handle で取り外されました
    curl_close($ch); // シングルを閉じます cURL ハンドル,無料のリソース
}

curl_multi_close($multiHandle); // 最後の終わり multi handle

これは、すべてのリソースがリリースされるようにするための重要なステップです。 Curl_close()を1つずつ呼び出すことなく、 curl_multi_close()をオフにするだけでは十分ではありません。

4。ベストプラクティスと提案

  1. 常に明示的にリリース:単一のリクエストであろうと複数のリクエストであろうと、 curl_close()を使用することを常に忘れないでください。

  2. finallyまたはエラー処理を使用するか、処理中に例外がある場合があります。ハンドルが最終的にリリースされることを確認するために、試用式構造を使用することをお勧めします。

  3. メモリと接続の監視カウント:高い並行性環境では、未発表のカールハンドルがリソースの疲労にすぐにつながる可能性があります。

  4. カプセル化要求ロジック:脱落を避けるために、リソースリリースを内部的に処理するために、それを関数またはクラスにカプセル化することをお勧めします。

5。概要

curl_close()は、PHP、特に複数のリクエストシナリオではオプションではありません。 curl_multi_remove_handle()およびcurl_close()の正しい使用により、システムの安定性とパフォーマンスが確保されます。リクエストロジックを書いた後、このステップを忘れないでください。リソースのクリーニングが最適なパフォーマンスの最適化です。