【问题标题】:curl_multi_exec performance conerncurl_multi_exec 性能问题
【发布时间】: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


【解决方案1】:

您的程序会像这样疯狂地循环,因为 curl_exec_multi() 将始终执行并尝试做某事,而您的程序不会相应地等待某事在您再次调用之前采取行动。

请参阅curl_multi_select 了解明确为此目的而创建的 PHP 函数,应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 2022-01-04
    • 2010-09-05
    • 2012-09-25
    • 2015-05-28
    • 2015-06-20
    • 2018-09-27
    • 2017-04-25
    相关资源
    最近更新 更多