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

bgc*_*ode 3 php curl libcurl

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

我听说你可能会遇到内存问题,打开太多句柄,这可能会导致致命的错误.如何避免这种情况并仍然尽可能快地提出我的URL请求?

如果我需要一次限制cURL请求的数量,那么将限制设置为什么是好的?

背景:我正在与Godaddy共享托管,这对cURL请求很好,尽管我没有用数千个并行请求测试它.将来,我将使用可以处理适度负载的Rackspace Cloud站点.

这个巨大的cURL请求是每年一次的事情,而不是每日网站操作的一部分.

tim*_*dev 5

这听起来像是一个建筑问题.为什么你需要同时发出数千个请求?那种parellism会不会有任何好处,或者你是不是偶然会遇到DOS(拒绝服务)一些可疑的Web服务/ API?

假设您没有敲击单个远程服务器,您仍然需要担心本地盒可以处理多少个连接.只有很多端口你可以使用传出,它们的测量成本低至数万.如果你疯狂地打开连接,就不难达到这个限制.任何使用apachebench过度负载测试的人都知道这一点.

PHP对于这种事情来说不是一个很好的工具 - 而且我是一个90%PHP的人.没有线程,而且内存密集.如果你想并行1000个PHP进程,那么你将需要多台机器.你的典型PHP进程将消耗大约10-20兆内存,除非你调整它的地狱(可能在编译时.

你说这种情况每年发生一次.这让我觉得可能不一定是所有的parellel.如果您只有24或36个并行进程怎么办?

那就是说,我可能会这样做.PHP可能会正常工作,如果你遇到内存效率低下的问题,你可以换掉一个部分.您需要两个或多或少的异步队列,以及一对处理它们的进程:

  • "获取队列" - 需要进行的HTTP请求的工作队列.他们执行请求并将数据粘贴到处理队列中(请参阅下一个项目符号).

  • "处理队列"工作队列,通过HTTP响应包含的任何内容.当队列被处理时,它可以将新项添加到"获取队列"

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

  • 一些咀嚼"处理队列"的过程 - 并不清楚并行性会对此有所帮助.所有这些处理都在本地进行,并且可能是一个简单的循环.