現在の位置: ホーム> 最新記事一覧> curl_multi_remove_handleを使用してマルチハンドルからCurlハンドルを正しく削除する方法は?

curl_multi_remove_handleを使用してマルチハンドルからCurlハンドルを正しく削除する方法は?

gitbox 2025-08-12

curl_multi_remove_handleとは何ですか?

curl_multi_remove_handle関数は、複数のCurlハンドルから個別のCurlハンドルを削除するために使用されます。複数のカールハンドルを使用すると、複数のリクエストを同時に実行でき、複数のカールハンドルを中央に管理します。リクエストが完了した場合、または不要になったら、 curl_multi_remove_handleを使用して、複数のハンドルからリクエストを削除できます。

関数プロトタイプ:

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span> ( resource </span><span><span class="hljs-variable">$multi_handle</span></span><span> , resource </span><span><span class="hljs-variable">$ch</span></span><span> )
</span></span>
  • $ multi_handle :curlマルチハンドルリソース、通常はcurl_multi_init()によって初期化されたハンドルです。

  • $ ch :削除する必要がある個別のCurlハンドルリソース、通常はcurl_init()によって初期化されたハンドルです。

この関数の返品値はブール値であり、成功したときにtrueを返し、失敗したときにfalseです


シナリオを使用します

通常、複数のCurl要求を実行するときは、 curl_multi_init()を使用して複数のCurlハンドルを初期化し、 curl_multi_add_handle()を介して複数の個別のCurlハンドルを追加します。リクエストが完了するか、エラーが発生したら、複数のハンドルから対応する個別のハンドルを削除する必要があります。その後、 curl_multi_remove_handleを使用できます。

サンプルコード:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>

</span><span><span class="hljs-comment">// 初期化 multi cURL ハンドル</span></span><span>
</span><span><span class="hljs-variable">$multi_handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();

</span><span><span class="hljs-comment">// 初期化两个单独的 cURL ハンドル</span></span><span>
</span><span><span class="hljs-variable">$ch1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>();
</span><span><span class="hljs-variable">$ch2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>();

</span><span><span class="hljs-comment">// 最初の要求を設定します URL その他のオプション</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>, CURLOPT_URL, </span><span><span class="hljs-string">'http://example.com/api/endpoint1'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);

</span><span><span class="hljs-comment">// 2番目のリクエストを設定します URL その他のオプション</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>, CURLOPT_URL, </span><span><span class="hljs-string">'http://example.com/api/endpoint2'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);

</span><span><span class="hljs-comment">// これら2つを置きます cURL ハンドル添加到 multi cURL ハンドル中</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$multi_handle</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$multi_handle</span></span><span>, </span><span><span class="hljs-variable">$ch2</span></span><span>);

</span><span><span class="hljs-comment">// リクエストを実行します</span></span><span>
</span><span><span class="hljs-keyword">do</span></span><span> {
    </span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$multi_handle</span></span><span>, </span><span><span class="hljs-variable">$active</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span>) {
        </span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$multi_handle</span></span><span>);
    }
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$active</span></span><span> &amp;&amp; </span><span><span class="hljs-variable">$status</span></span><span> == CURLM_OK);

</span><span><span class="hljs-comment">// 最初のものを削除します cURL ハンドル</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$multi_handle</span></span><span>, </span><span><span class="hljs-variable">$ch1</span></span><span>);

</span><span><span class="hljs-comment">// すべてを閉じます cURL ハンドル</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$multi_handle</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch1</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch2</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

解析コード

  1. マルチカールハンドルの初期化:最初にcurl_multi_init()を使用して、複数のハンドルを初期化します。これは、複数のリクエストの管理を担当します。

  2. 別のカールハンドルの初期化:次に、それぞれ2つのリクエストに対応する2つのカールハンドルCH1CH2を初期化します。

  3. リクエストオプションの設定:個々のカールハンドルごとに要求されたURLおよび返信データオプションを設定します。

  4. マルチカールハンドルにハンドルを追加: curl_multi_add_handle()を使用して、 CH1CH2を複数のカールハンドルに追加して、同時に実行できるようにします。

  5. 実行要求: curl_multi_exec()を使用して、複数のハンドルに追加されたすべてのリクエストを処理および実行し、 curl_multi_select()を使用してリクエストが完了するのを待ちます。

  6. curlハンドルを削除します:リクエストが完了した場合、またはリクエストが不要になったら、 curl_multi_remove_handle()を使用して、複数のハンドルからリクエストのcurlハンドルを削除できます。

  7. ハンドルを閉じます:最後に、複数のハンドルとすべての個別のカールハンドルを閉じて、リソースを解放します。


注意すべきこと

  1. 削除時間:リクエストが完了した場合のみ、またはリクエストが不要になったことを確認した場合にのみ、対応するカールハンドルを削除する必要があります。操作が削除された後、そのハンドルは要求の実行に参加しなくなります。

  2. リソースリリース: Curlハンドルを削除した後でも、 Curl_Close()を明示的に呼び出してCurlリソースをリリースするには、Curl_Close()が必要です

  3. 並行性の制限: CONCURRENCYシナリオの高いシナリオでは、 CURL_MULTI_REMOVE_HANDLEを使用すると、複数の並行リクエストを効果的に管理し、不必要なハンドルをタイムリーにクリーンアップし、不必要なリソース職業を回避できます。