以下示例取自:
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)
这样的约会。
我的担忧有效吗?
如果是这样,睡眠解决方案是否合适?
如果没有,为什么?
答案 0 :(得分:4)
你的程序就像疯了一样循环,因为curl_exec_multi()会一直执行并尝试做某事,而你的程序在再次调用它之前不会等待某些事情要做。
有关为此目的明确制作的PHP函数,请参阅curl_multi_select,并解决您的问题。