当前位置: 首页> 最新文章列表> 怎么用 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 可以帮助有效地管理多个并发请求,及时清理不再需要的句柄,避免不必要的资源占用。