【问题标题】:Is PHP-CURL's curl_multi_exec really multithreaded internally?PHP-CURL 的 curl_multi_exec 在内部真的是多线程的吗?
【发布时间】:2024-07-03 11:55:02
【问题描述】:

我的问题很简单,如标题所述。不过我再次改写。

我想使用 php-curl 下载多个站点。我将从控制台运行它。我将使用curl_multi_exec 下载所有站点。现在的问题是,curl 会为每个请求创建不同的 线程 吗?

我知道我可以通过分叉多个进程来实现它。但这不是线程。我不想穿线。我想知道它是否是多线程的?

【问题讨论】:

  • 虽然这个问题可以通过查看 cURL 的 source 来简单地回答,但潜在的问题可能更有趣:你为什么想知道这个?详细说明您为什么认为 multicURL 使用线程。
  • 我实际上是在尝试同时下载文件。但是 PHP 不是多线程的。所以我想试试curl_multi_*。然后我想到了这个问题。
  • 一个正在执行的 PHP 脚本可能发生在一个线程上,这并没有说明您调用的库(如 cURL)。您执行的任何外部调用都可能启动一个或多个新线程。

标签: php multithreading curl libcurl


【解决方案1】:

没有。 libcurl 多接口(PHP 在后台使用它来完成这项工作)并行执行多个请求,但它使用非阻塞 API 调用来执行此操作。不是线程。

过去

(这个部分现在可以被认为是历史性的,因为几年前 libcurl 默认使用线程解析器构建。)

当特定的传输需要解析主机名时,人们可能会面临的问题是,因为大多数操作系统中的标准主机名解析器功能是同步的,这使得每个解析都会阻止所有其他传输。这在 libcurl 中通过提供替代解析器后端来克服,例如一个使用 c-ares 进行解析,另一个在单独的线程中启动“库存解析器” - 所谓的线程解析器。

【讨论】:

  • 是的,我们知道在PHP端,有一个单线程。 cURL 内部呢?我认为这就是这里的问题。暂时忽略名称解析问题。
  • 我在内部谈论 libcurl。我不知道 PHP 的东西,但我非常了解 libcurl 的内部结构......
  • @Brad 我认为除了作者本人之外没有人能回答得更好。
最近更新 更多