设置的最大 cURL 连接数是多少?

2022-08-31 01:13:15

我有一个脚本,它使用PHP中的curl_multi_*函数运行1000个cURL请求。

超时背后的瓶颈是什么?

会是 CPU 使用率吗?就服务器如何处理出站连接的数量而言,有没有更有效的方法来执行此操作?

我无法更改功能,请求本身是对远程API的简单调用。我只是想知道限制是什么 - 我需要增加服务器上的内存,Apache连接或CPU吗?(或者我错过的其他东西)


答案 1

您的请求是在单个执行线程中发出的。瓶颈几乎可以肯定是CPU,你有没有真正看过curl多代码运行?...它非常耗费CPU;因为您实际上没有足够的控制权来处理请求。curl_multi使您可以一次协调1000个请求,但这并不能使其成为一个好主意。您几乎没有机会有效地使用curl_multi,因为您无法足够精细地控制执行流,只是为套接字提供服务并在它们上选择()将占您在命令行上看到代码运行时看到的大量高CPU使用率。

在此类任务期间CPU使用率高的原因是这个;PHP被设计为运行几分之一秒,尽可能快地完成所有事情。CPU的利用率通常无关紧要,因为它的时间太短了。当你延长这样的任务时,问题变得更加明显,每个操作码产生的开销对程序员来说都是可见的。

我知道你已经说过你不能改变实现,但仍然,为了一个完整的答案。这样的任务比 curl multi 更适合 Threading,你应该开始阅读 http://php.net/pthreads,从 http://php.net/Thread

留给他们自己的设备在空闲的CPU上,即使是1000个线程也会消耗与curl_multi一样多的CPU,重点是你可以精确地控制负责下载响应的每个字节并上传请求的每个字节的代码,如果CPU使用率是一个问题,你可以通过显式调用usleep来实现一个“好”的过程, 或者以有意义的方式限制连接使用,此外,您的请求可以在单独的线程中提供服务。

我不建议1000线程是要做的事情,它很可能不是。要做的是设计一个可堆叠的(参见文档),其工作是以“漂亮”,有效的方式提出和服务请求,并设计池(参见github / pecl扩展源上的示例)的工作人员来执行您新设计的请求...


答案 2

推荐