我有一个脚本,它使用PHP中的curl_multi_*函数运行1000个cURL请求.
超时背后的瓶颈是什么?
是CPU使用率?就服务器处理的出站连接数量而言,是否有一些更有效的方法来执行此操作?
我无法更改功能,请求本身就是对远程API的简单调用.我只是想知道限制是什么 - 我需要增加服务器,Apache连接或CPU的内存吗?(或者我错过的其他东西)
Joe*_*ins 12
您的请求是在单个执行线程中进行的.瓶颈几乎肯定是CPU,你有没有真正看过curl多代码运行?...这是令人难以置信的cpu饥饿; 因为你对处理请求没有足够的控制权.curl_multi使您可以一次编排1000个请求,但这并不是一个好主意.你几乎没有机会有效地使用curl_multi,因为你无法很好地控制执行流程,只需要为套接字服务并选择()它们就会占用你看到代码运行的大量高CPU使用率.命令行.
在这样的任务中CPU使用率高的原因是这样的; PHP的设计运行时间只有几分之一秒,尽可能快地完成所有事情.CPU的使用方式通常无关紧要,因为它的使用时间很短.当您延长这样的任务时问题变得更加明显,每个操作码产生的开销变得对程序员可见.
我知道你已经说过你不能改变实现,但仍然是一个完整的答案.这样的任务是更为适合线程比卷曲多,你应该开始阅读http://php.net/pthreads,从http://php.net/Thread
在空闲CPU上留给自己的设备,即使1000个线程也会消耗与curl_multi一样多的CPU,关键是您可以精确控制负责下载每个响应字节的代码并上传请求的每个字节,如果CPU使用率是您可以通过显式调用usleep或以有意义的方式限制连接使用来实现"好"过程,另外您的请求可以在单独的线程中进行服务.
我不建议1000个线程是要做的事情,它很可能不是.要做的就是设计一个Stackable(参见文档),其工作是以"漂亮",高效的方式制作和服务请求,并设计工作池(请参阅github/pecl扩展源上的示例)来执行新设计的要求......
| 归档时间: |
|
| 查看次数: |
10016 次 |
| 最近记录: |