php在循环中做curl会减慢服务器的速度吗?

时间:2013-07-12 17:53:00

标签: php wordpress curl wordpress-plugin libcurl

如果我的循环中发生了大量的curl执行,那么运行该进程的服务器会减慢吗?我意识到当这个过程运行时,我打开一个新选项卡来访问网站上的其他页面时,它会在正在发生的卷曲过程完成之前加载,是否有一种方法可以在不干扰性能的情况下运行此过程该网站?

例如,这就是我正在做的事情:

foreach ($chs as $ch) {
    $content = curl_exec($ch);
    ... do random stuff...
}

我知道我可以做多卷曲,但出于我正在做的目的,我需要像这样做。

修改

好吧,也许这可能会改变一些事情但我实际上希望这个过程使用WordPress cron运行。如果这是作为WordPress“cron”运行,它会阻碍WordPress网站的页面性能吗?所以从本质上讲,如果流程正在运行,并且人们试图访问该网站,那么它们是否会滞后?

3 个答案:

答案 0 :(得分:1)

curl请求不是异步的,因此使用curl,在该循环之后的任何代码都必须等待执行,直到curl请求依次完成为止。

curl_multi_init是PHP针对此问题的修复程序。你提到你需要按照自己的方式去做,但有没有办法可以重构使用它?

http://php.net/manual/en/function.curl-multi-init.php

作为替代方案,这个库也非常适用于此目的:https://github.com/petewarden/ParallelCurl

答案 1 :(得分:1)

除非您使用严格的1线程服务器进行开发,否则不太可能。不同的请求例如在Apache中由工作人员处理(这取决于您的确切设置可以是线程还是单独的进程),并且所有这些工作者独立运行。

您看到的效果是由您的浏览器引起的,而不是由服务器引起的。在rfc 2616中建议客户端仅打开与服务器的有限数量的并行连接:

  

使用持久连接的客户端应该限制数量   它们维护到给定服务器的同时连接。一个   单用户客户端不应该保持2个以上的连接   任何服务器或代理。

顺便说一下,rfc 2119

解释了SHOULDSHOULD NOT等大写关键字的标准用法

这就是Firefox和其他浏览器也可以使用的默认设置。通过打开更多标签,您可以快速耗尽这些平行的开放通道,这就是导致等待的原因。

编辑:但在阅读@ earl3s的回复之后,我意识到还有更多内容:earl3s解决了每个页面请求中的性能(以及服务器的“性能”,如个人用户所经历的),实际上可以加速通过并行化curl请求来实现。但是以创建多个同时链接到您正在查询的系统为代价......这就是rfc2616的建议重新发挥作用的地方:除非提供内容的后端系统在您的控制之下,否则您应该三思而后行与您的卷曲请求并行,因为系统上的每个页面都会在后端系统中同时出现n个点击...

EDIT2:回答OP的澄清:否(出于我在第一段中解释的相同原因 - “cron”作业将在另一个工作者中运行,而不是为那些为您的用户服务的工作者),如果您没有过度使用,也就是说,不要在并行线程上疯狂,你甚至可以温和地并行化传出的请求。但后者更多的是一个好邻居,而不是因为害怕遇到你自己的服务器。

答案 2 :(得分:0)

我刚刚对它进行了测试,看起来在WP的“cron”上运行的多卷曲过程对网站的性能没有明显的负面影响。当网站运行多卷曲过程时,我能够加载多个其他页面,网站没有可怕的延迟。所以看起来没关系。而且我还确保存在锁定,以便此过程不会多次安排。此外,这个过程每天只在美国低峰时段运行一次。感谢。