0

如果我有一个循环发生了很多 curl 执行,那会减慢运行该进程的服务器吗?我意识到,当此过程运行时,我打开一个新选项卡以访问网站上的其他页面,直到正在发生的 curl 过程完成,它才会加载,有没有办法让这个过程在不影响性能的情况下运行网站的?

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

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

我知道我可以做多卷曲,但为了我正在做的事情,我需要这样做。

编辑:

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

4

3 回答 3

1

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

curl_multi_init是 PHP 对这个问题的修复。您提到您需要按照自己的方式进行操作,但是有没有一种方法可以重构以使用它?

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

作为替代,这个库也非常适合这个目的:https ://github.com/petewarden/ParallelCurl

于 2013-07-12T18:01:17.490 回答
1

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

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

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

顺便说一句,大写关键字的标准用法如这里SHOULD,并SHOULD NOTrfc 2119中进行了解释

这就是例如 Firefox 和可能其他浏览器也使用的默认值。通过打开更多选项卡,您可以快速耗尽这些并行打开的通道,这就是导致等待的原因。

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

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

于 2013-07-12T18:05:54.523 回答
0

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

于 2013-11-27T17:46:05.027 回答