php - curl_multi_exec 性能问题

标签 php loops curl parallel-processing sleep

以下示例摘自:

http://php.net/manual/en/function.curl-multi-close.php#example-3540

This example will create two cURL handles, add them to a multi handle, and then run them in parallel.

<?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 循环中,我添加了一个小计数器,显示在 ~5 秒内,curl_multi_exec 和 do 循环分别在我的本地计算机上执行了 ~5000000 次。这大约是每微秒运行一次,这确实是很多。

我担心这会占用大量的 CPU 资源,而只是等待请求完成,基本上什么也不做。

我记得我在 Java 类(class)中学到的第一件事就是避免无限循环并使用线程 sleep /中断,而不是出于上述原因。

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

由于这是一个官方示例,我想我宁愿先询问这里的专家。

我考虑过在 do 循环中实现短暂的 sleep 。类似usleep(100)

  • 我的担忧是否有效?

    • 如果是这样, sleep 解决方案好吗?

      • 如果是这样,什么时间间隔比较合适?我希望东西尽可能小,这样进程就不会减慢,但我也不想破坏服务器。
    • 如果没有,为什么?

最佳答案

你的程序像这样疯狂地循环,因为curl_exec_multi()总是会执行并尝试做一些事情,而你的程序在你再次调用它之前不会相应地等待某些事情发生。

参见curl_multi_select PHP 函数是专门为此目的而创建的,应该可以解决您的问题。

关于php - curl_multi_exec 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6911269/

相关文章:

php - CodeIgniter - 我的自定义 session 数据是否被 Facebook 剥离?

php - 通过js创建文本框

c++ - 如何在图网络中找到闭环

php - cURL SSL PUT/POST (php) 的延迟响应(NSS 与 OpenSSL)

c++ - 如何通过 C++ 在 wxWidgets 中显示来自互联网的图像?

PHP foreach 语句引用 : unexpected behaviour when reusing iterator

php - 通过关系抓取数据。 1 个大查询或几个小查询

python - 在没有字符串切片的情况下打印字符串中的奇数字符?

javascript - 当有内部循环时, map 没有返回数组

bash - 无法在 curl 中插入带有两个 header 的变量