php - 打开数以千计的 cURL 句柄而不会遇到问题? (PHP)

标签 php curl libcurl

我需要在 PHP 中使用 cURL 向 API 发出数千 cURL 请求。我目前的计划是与 curl_multi_() 函数并行执行这些操作。基本上是一次并行执行所有数千个 cURL 请求。

我听说打开太多句柄可能会遇到内存问题,这可能会遇到 fatal error 。如何避免这种情况并尽可能快地发出我的 URL 请求?

如果我需要限制一次发出的 cURL 请求的数量,将限制设置为多少比较好?

背景:我现在正在与 Godaddy 共享主机,它可以很好地处理 cURL 请求,但我还没有用数千个并行请求对其进行测试。以后我会在 Rackspace Cloud Site 上可以处理适度的负载。

如此庞大的 cURL 请求数量是每年一次,而不是日常网站运营的一部分。

最佳答案

这听起来像是一个架构问题。为什么需要同时发出数千个请求?这种并行机制是否有任何好处,或者您是否会不小心 DOS(拒绝服务)一些可疑的 Web 服务/API?

假设您没有攻击单个远程服务器,您仍然需要担心本地机器可以处理多少个连接。您可以使用传出端口的数量有限,而且数量少则数万个。如果您疯狂地打开连接,那么达到这个限制并不难。任何使用 apachebench 进行过度负载测试的人都知道这一点。

对于这类事情,PHP 不是一个很好的工具——我是一个 90% 都在用 PHP 的人。没有线程,而且它是内存密集型的。如果你想并行运行 1000 个 PHP 进程,你将需要不止一台机器。您的典型 PHP 进程将消耗大约 10-20 兆内存,除非您彻底调整它(可能在编译时)。

你说这种情况每年发生一次。这让我觉得可能没有必要那么平行。如果您只有 24 或 36 个并行进程怎么办?

也就是说,这就是我可能采用的方法。 PHP 可能会很好地工作,如果您遇到内存效率低下的问题,您可以只换掉一部分。您需要两个或多或少的异步队列,以及一对处理它们的进程:

  • “获取队列”- 需要发出的 HTTP 请求的工作队列。他们执行请求并将数据放入处理队列(见下一个项目符号)。

  • “处理队列”是一个工作队列,处理 HTTP 响应包含的任何内容。随着队列得到处理,它可以将新项目添加到“获取队列”

  • 在获取队列上并行运行的一些进程(或几十个)。并行性在这里很好,因为由于网络,您有很多延迟。

  • 一些处理“处理队列”的进程 - 目前尚不清楚并行性是否会有所帮助。所有这些处理都发生在本地,并且可能是一个简单的循环。

关于php - 打开数以千计的 cURL 句柄而不会遇到问题? (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4290348/

相关文章:

c - 为什么RTSP播放命令在RTP端口收到设备篡改数据包?

启用 SSL 的 Iphone libcurl ..?

c++ - 使用 libcurl 发送 "request payload"?

php - 处理数据修改

javascript - 从选择中删除和恢复选项

php - 使用 cURL 在 api 中拒绝承载授权

linux - 通过命令行从站点下载图像

php - 网站的新评论通知实现

PHP flush() 显然可以在我的 Linux 机器上运行,但不能在我的 Windows 机器上运行?

curl - Jenkins 远程触发器不工作