PHP cURL请求之间的multi_exec延迟

时间:2011-08-08 19:21:06

标签: php multithreading curl delay curl-multi

如果我运行标准的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方法?这也将回答我的问题。

4 个答案:

答案 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后可以添加更多句柄。