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"><?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> && </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">?></span></span><span>
</span></span>
初始化multi cURL 句柄:我們首先使用curl_multi_init()初始化一個多重句柄,這個句柄將負責管理多個請求。
初始化單獨的cURL 句柄:然後,我們初始化兩個cURL 句柄ch1和ch2 ,分別對應兩個請求。
設置請求選項:對每個單獨的cURL 句柄設置請求的URL 和返回數據的選項。
將句柄添加到multi cURL 句柄中:使用curl_multi_add_handle()將ch1和ch2添加到多重cURL 句柄中,以便它們可以並發執行。
執行請求:使用curl_multi_exec()處理並執行所有添加到多重句柄中的請求,並使用curl_multi_select()來等待請求的完成。
移除cURL 句柄:一旦某個請求完成或我們不再需要某個請求時,就可以使用curl_multi_remove_handle()來從多重句柄中移除該請求的cURL 句柄。
關閉句柄:最後,關閉多重句柄和所有的單獨cURL 句柄,釋放資源。
移除時機:只有當請求已經完成或者我們確認不再需要該請求時,才應該移除相應的cURL 句柄。移除操作後,那個句柄將不再參與任何請求的執行。
資源釋放:即使移除cURL 句柄之後,還需要顯式調用curl_close()來釋放cURL 資源,否則可能會造成內存洩漏。
並發限制:在高並發場景下,使用curl_multi_remove_handle可以幫助有效地管理多個並發請求,及時清理不再需要的句柄,避免不必要的資源佔用。