当前位置: 首页> 最新文章列表> curl_multi_close 执行时是否需要检查所有句柄的状态?

curl_multi_close 执行时是否需要检查所有句柄的状态?

gitbox 2025-05-12

在使用 PHP 的 curl_multi_* 系列函数时,curl_multi_close 是用来关闭一个由 curl_multi_init 创建的句柄的。但很多开发者在调用 curl_multi_close 之前会疑惑:

答案是:通常不需要,但合理管理资源仍然是一个好习惯。

理解 curl_multi_close 的行为

根据 PHP 官方文档,curl_multi_close 的作用是销毁一个 cURL multi 句柄,并且会自动释放与 multi 句柄关联的资源。然而,它不会自动关闭通过 curl_init 创建并添加到 multi handle 的各个 cURL 句柄。你需要在调用 curl_multi_close 之前,手动使用 curl_close 关闭每一个单独的 cURL 句柄。

如果不这样做,这些单独的 cURL 句柄仍然占用内存资源,可能导致内存泄漏。

正确的资源管理示例

以下是一个正确管理 multi handle 和单个 curl 句柄的 PHP 示例:

<?php

// 初始化多个 curl 句柄
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');

// 创建一个 curl_multi 句柄
$mh = curl_multi_init();

// 添加句柄到 multi handle
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 执行
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

// 移除句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// 关闭单个句柄
curl_close($ch1);
curl_close($ch2);

// 最后关闭 multi handle
curl_multi_close($mh);
?>

在上面的代码中:

  1. 先用 curl_multi_remove_handle 把单个句柄从 multi handle 中移除;

  2. 再单独 curl_close 关闭每一个 curl 句柄;

  3. 最后用 curl_multi_close 关闭 multi handle 本身。

这样可以确保所有资源都正确释放,不会有遗留的句柄或内存泄漏问题。

小结

  • curl_multi_close 只负责 multi handle 本身的销毁;

  • 单个 curl 句柄需要你手动关闭;

  • 不需要检查句柄的“状态”,但需要确保移除并关闭每一个单独的 curl 句柄

  • 养成良好的资源管理习惯是避免内存泄漏和系统资源浪费的关键。