現在の位置: ホーム> 最新記事一覧> curl_multi_initを使用して正しい順序でcurl_multi_closeを使用します

curl_multi_initを使用して正しい順序でcurl_multi_closeを使用します

gitbox 2025-05-12

PHPでは、 Curlは強力で一般的に使用されるネットワークリクエストツールであり、 curl_multi_*一連の関数が許可されています。これは、高性能インターフェイス集約、非同期リクエストなどのシナリオで非常に便利です。

ただし、多くの開発者は、 curl_multi_*を使用する場合、特にcurl_multi_close()を使用する場合、リソースリリースプロセスを無視することがよくあります。この記事では、標準プロセスをメインラインとして取得し、 curl_multi_init to curl_multi_closeの完全な使用法を段階的に理解し、コードの例で補完されます。

1。curl_multiシリーズの機能は何ですか?

PHPが提供するCURL_MULTI_*一連の関数は、複数の同時CURLハンドルを管理するためのツールです。これは、従来のシングルカール要求とは異なり、複数のHTTP要求を同時に開始できるため、応答効率が向上します。

これらの機能を使用すると、次の手順にほぼ分割できます。

  1. マルチハンドルの初期化: curl_multi_init()

  2. 複数のCurlリクエストを追加する(簡単なハンドル): curl_multi_add_handle()

  3. リクエストを実行する: curl_multi_exec()およびcurl_multi_select()

  4. 応答コンテンツを取得: curl_multi_getContent()

  5. 簡単なハンドルを削除して閉じます: curl_multi_remove_handle()およびcurl_close()

  6. マルチハンドルを閉じる: curl_multi_close()

2。標準プロセスの説明とコードの例

以下は、3つの異なるURLを同時にリクエストする必要があると仮定して、標準のマルチレクエストプロセスです。

 <?php

// 要求する URL リスト
$urls = [
    "https://gitbox.net/api/service1",
    "https://gitbox.net/api/service2",
    "https://gitbox.net/api/service3"
];

// 初期化 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];

// 1. それぞれのため URL aを作成します curl easy handle そして追加します multi handle 真ん中
foreach ($urls as $i => $url) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    curl_multi_add_handle($multiHandle, $ch);
    $curlHandles[$i] = $ch;
}

// 2. 埋め込む multi 聞く
$active = null;
do {
    $mrc = curl_multi_exec($multiHandle, $active);
    // インターネットを待っています I/O 準備をしてください,避ける CPU 占有が高すぎる
    if ($mrc == CURLM_OK) {
        curl_multi_select($multiHandle);
    }
} while ($active > 0 && $mrc == CURLM_OK);

// 3. コンテンツとクリーンハンドルを取得します
$responses = [];
foreach ($curlHandles as $i => $ch) {
    // 応答コンテンツを取得します
    $responses[$i] = curl_multi_getcontent($ch);

    // シングルを取り外して閉じます handle
    curl_multi_remove_handle($multiHandle, $ch);
    curl_close($ch);
}

// 4. 最後の終わり multi handle,無料のリソース
curl_multi_close($multiHandle);

// 出力結果
foreach ($responses as $index => $body) {
    echo "Response from URL #{$index}: \n";
    echo $body . "\n\n";
}

3.なぜcurl_multi_closeが重要なのですか?

curl_multi_close()は簡単なハンドルをすぐに破壊しませんが(最初にそれらを取り外して閉じる必要があります)、マルチハンドル自体が占める基礎となるリソースを解放する責任があります。呼び出すのを忘れた場合、レジデントプロセスなどの長期にわたるスクリプトでメモリリークまたはファイル記述子の疲労を引き起こす可能性があります。

要約: curl_multi_init()を使用するスクリプトは、 curl_multi_close()で終了する必要があります!

4.よくある質問

  1. ブロッキングとスタックをリクエストしますか?

    • curl_multi_select()が正しく使用されているかどうかを確認してください。

    • curl_setopt(...、curlopt_returntransfer、true)が見逃さないことを確認してください。

  2. メモリリークまたは接続の例外?

    • curl_multi_remove_handle()curl_close()は、各リクエストの後に呼び出されますか?

    • curl_multi_close()は最終的に呼び出されますか?

5。概要

curl_multi_*は、ネットワークを同時にリクエストする際に非常に効率的な手段を提供します。 curl_multi_init()からcurl_multi_close()までの完全なプロセスをマスターすると、コードパフォーマンスとリソース管理機能を効果的に改善できます。

これらの3つの「必須」を覚えておいてください:

  • 各リクエストはマルチハンドルに追加する必要があります。

  • 各リクエストは、完了時に削除および閉じている必要があります。

  • 最後に、multiリソースを解放するには、 curl_multi_close()を呼び出す必要があります。

標準化されたプロセスとリソース管理を通じて、PHPの同時リクエストはより堅牢で効率的になります。