以下示例摘自:
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/