如果我运行标准的cURL_multi_exec函数(下面的示例),我会立即获得所有请求的cURL句柄。我想在每个请求之间延迟100毫秒,有没有办法做到这一点? (在Google和StackOverflow搜索中找不到任何内容)
我在curl_multi_exec()之前尝试过usleep(),这会减慢脚本速度,但不会推迟每个请求。
// array of curl handles & results
$curlies = array();
$result = array();
$mh = curl_multi_init();
// setup curl requests
for ($id = 0; $id <= 10; $id += 1) {
$curlies[$id] = curl_init();
curl_setopt($curlies[$id], CURLOPT_URL, "http://google.com");
curl_setopt($curlies[$id], CURLOPT_HEADER, 0);
curl_setopt($curlies[$id], CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $curlies[$id]);
}
// execute the handles
$running = null;
do {
curl_multi_exec($mh, $running);
} while($running > 0);
// get content and remove handles
foreach($curlies as $id => $c) {
$result[$id] = curl_multi_getcontent($c);
curl_multi_remove_handle($mh, $c);
}
// all done
curl_multi_close($mh);
我整天都在努力,任何帮助都将不胜感激!谢谢。
编辑:任何其他非cUrl方法?这也将回答我的问题。
答案 0 :(得分:3)
是的,这是可能的。如果您使用ParallelCurl library,则可以使用usleep()
更轻松地添加100毫秒的延迟,因为您可以将单独的请求添加到下载队列中。
for ($urls as $url) {
$pcurl->startRequest($url);
usleep(100000);
}
答案 1 :(得分:2)
不要以为你可以。如果从cli运行此命令,则可以将fork your script改为10个进程,然后从每个进程中触发常规curl请求。这样就可以对时间进行细致的控制。
答案 2 :(得分:1)
PHP不是解决方案。分叉脚本也无济于事。在一开始是的,但是一旦你有更多的网站,你需要抓住这样你会发现自己作为你的服务器非常非常红。在成本和脚本稳定性方面,您应该重新考虑使用其他一些想法。
您可以轻松地使用Python,并且在非阻塞实时调用API端点的情况下,您应该使用Socket.IO + Node.JS之类的东西,或者只使用Node.JS或者好吧,呵呵......大声笑p>
如果你没有时间也不会使用这样的东西:
http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html
实际上一切都取决于你想要达到的目标。
答案 3 :(得分:0)
你可以试试这个:
在DB中存储时间戳,添加一个句柄并调用curl_multi_exec
使用CURLOPT_PROGRESSFUNCTION
检查时间并在需要时添加更多手柄
Here Daniel Stenberg(cURL和libcurl的作者)说在执行curl_multi_exec
后可以添加更多句柄。