【发布时间】:2011-10-18 04:24:40
【问题描述】:
以下示例摘自:
http://php.net/manual/en/function.curl-multi-close.php#example-3540
这个例子将创建两个 cURL 句柄,将它们添加到一个多句柄中, 然后并行运行它们。
<?php
// create both cURL resources
$ch1 = curl_init();
$ch2 = curl_init();
// set URL and other appropriate options
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
//create the multiple cURL handle
$mh = curl_multi_init();
//add the two handles
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$running=null;
//execute the handles
do {
curl_multi_exec($mh,$running);
} while ($running > 0);
//close the handles
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>
我对其进行了一些调整以满足我的需求。我只想调用一个资源,但在请求时执行本地代码。这工作得很好,我的性能问题也适用于未经修改的示例。
我制作了需要 5 秒才能交付的资源,并将它们用作 $ch1 和 $ch2
正如预期的那样,整个执行只用了 5 秒而不是 10 秒。
但在 do 循环中,我添加了一个小计数器,显示 curl_multi_exec 和 do 循环分别在 ~5 秒内在我的本地计算机上执行了 ~5000000 次。这大约是每微秒运行一次,这确实是很多。
我担心这会占用大量的 CPU 资源,而只是等待请求完成并且基本上什么都不做。
我记得我在 Java 课程中学到的第一件事就是避免无限循环,而是使用线程休眠/中断来代替上述原因。
但是我们这里没有线程,我不知道这对 PHP 是否也有效。
因为这是一个官方的例子,我想我还是先问问这里的专家。
我想过在 do 循环中实现一个短暂的睡眠。类似于usleep(100)。
-
我的担忧有效吗?
-
如果是这样,睡眠解决方案是一个好的解决方案吗?
- 如果是这样,什么是好的睡眠间隔?我喜欢尽可能小的东西,这样就不会减慢进程,但我也不想锤击服务器。
如果不是,为什么?
-
【问题讨论】:
-
我个人不能说,但您可以通过添加微睡眠进行测试。如果它增加了时间,那么对
curl_multi_exec的永久调用是必要的。无论如何,100 微秒对我来说看起来不错,也许更多是为了让测试结果更明显。 -
如果您决定使用usleep(100),如果您在windows Windows 上运行,请小心。请参阅警告here。
标签: php loops curl parallel-processing sleep