PHP-CURL的curl_multi_exec在内部真的是多线程吗?

6
我的问题很简单,正如标题所述。但我再重新阐述一下。
我想使用php-curl下载多个网站。我将从控制台运行它。我将使用curl_multi_exec来下载所有网站。现在的问题是,curl会为每个请求创建不同的线程吗?
我知道我可以通过分叉多个进程来实现它。但那不是线程。我不想要线程。我想知道它是否是多线程?

虽然这个问题可以通过查看cURL的源代码来简单回答,但是更有趣的是背后的问题:为什么你想知道这个?请提供更多关于为什么您认为multicURL不使用线程的信息。 - CodeCaster
我实际上正在尝试同时下载文件。但是PHP不支持多线程。所以我想尝试使用curl_multi_*。然后这个问题浮现在我的脑海中。 - Shiplu Mokaddim
1
一个正在执行的 PHP 脚本可能会在一个线程上运行,但这并不代表你调用的库(比如 cURL)也是这样。你执行的任何外部调用都可能启动一个或多个新线程。 - CodeCaster
1个回答

13
不是。libcurl多接口(PHP在幕后使用它来完成此工作)可以并行执行多个请求,但它使用非阻塞API调用实现,而不是线程。
过去的情况:
(此部分现在可以被视为历史,因为自多年以来 libcurl 默认构建为带线程的解析器。)
当特定传输需要解析主机名时,问题可能出现,因为大多数操作系统中的标准主机名解析器函数是同步的,这使得每个解析都会阻塞其他传输。在 libcurl 中通过提供替代解析器后端来克服这个问题,例如一个使用 c-ares 进行解析的内置解析器和另一个在单独的线程中启动“默认解析器”的所谓线程化解析器。

是的,我们知道在PHP端只有一个线程。那么cURL内部呢?我想这就是问题所在。暂时忽略名称解析问题。 - Brad
1
我在谈论libcurl的内部。我不了解PHP相关的内容,但是我非常熟悉libcurl的内部机制... - Daniel Stenberg
2
@Brad 我认为除了作者本人,没有人能够回答得更好。 - Shiplu Mokaddim
据推测,使用curl multi比不使用线程更快/使用更少的资源/内存?我认为操作系统不会在其方面运行线程,并且有更快的方法来处理所有事情。 - Kevin Wheeler
主要是它的资源占用更少。在Linux上,一个普通的线程至少需要8MB的堆栈空间。100个线程意味着仅在堆栈上就浪费了800MB的内存... - Daniel Stenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接