當前位置: 首頁> 最新文章列表> 怎麼用curl_multi_remove_handle 正確從multi handle 中移除一個cURL 句柄?

怎麼用curl_multi_remove_handle 正確從multi handle 中移除一個cURL 句柄?

gitbox 2025-08-12

什麼是curl_multi_remove_handle?

curl_multi_remove_handle函數用於從一個多重cURL 句柄中移除一個單獨的cURL 句柄。多重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">// 設置第二個請求的 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">// 將這兩個 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. 初始化multi cURL 句柄:我們首先使用curl_multi_init()初始化一個多重句柄,這個句柄將負責管理多個請求。

  2. 初始化單獨的cURL 句柄:然後,我們初始化兩個cURL 句柄ch1ch2 ,分別對應兩個請求。

  3. 設置請求選項:對每個單獨的cURL 句柄設置請求的URL 和返回數據的選項。

  4. 將句柄添加到multi cURL 句柄中:使用curl_multi_add_handle()ch1ch2添加到多重cURL 句柄中,以便它們可以並發執行。

  5. 執行請求:使用curl_multi_exec()處理並執行所有添加到多重句柄中的請求,並使用curl_multi_select()來等待請求的完成。

  6. 移除cURL 句柄:一旦某個請求完成或我們不再需要某個請求時,就可以使用curl_multi_remove_handle()來從多重句柄中移除該請求的cURL 句柄。

  7. 關閉句柄:最後,關閉多重句柄和所有的單獨cURL 句柄,釋放資源。


注意事項

  1. 移除時機:只有當請求已經完成或者我們確認不再需要該請求時,才應該移除相應的cURL 句柄。移除操作後,那個句柄將不再參與任何請求的執行。

  2. 資源釋放:即使移除cURL 句柄之後,還需要顯式調用curl_close()來釋放cURL 資源,否則可能會造成內存洩漏。

  3. 並發限制:在高並發場景下,使用curl_multi_remove_handle可以幫助有效地管理多個並發請求,及時清理不再需要的句柄,避免不必要的資源佔用。