curl_multi_exec性能conern

时间:2011-08-02 11:26:01

标签: php loops curl parallel-processing sleep

以下示例取自:

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课程中学到的第一件事就是避免无休止的循环并使用Thread睡眠/中断而不是出于上述原因。

但是我们这里没有线程,我也不知道这对PHP是否也有效。

由于这是一个官方的例子,我认为我宁愿先问专家。

我想过在do循环中实现一个短暂的睡眠。像usleep(100)这样的约会。

  • 我的担忧有效吗?

    • 如果是这样,睡眠解决方案是否合适?

      • 如果是这样,那么睡眠间隔会是多少?我会喜欢尽可能小的东西,所以没有任何过程变慢,但我也不想锤击服务器。
    • 如果没有,为什么?

1 个答案:

答案 0 :(得分:4)

你的程序就像疯了一样循环,因为curl_exec_multi()会一直执行并尝试做某事,而你的程序在再次调用它之前不会等待某些事情要做。

有关为此目的明确制作的PHP函数,请参阅curl_multi_select,并解决您的问题。