6

如果我运行一个标准的 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

4 回答 4

4

是的,这是可能的。如果您使用ParallelCurl 库,您可以更轻松地添加 100 毫秒延迟usleep(),因为您可以发出单独的请求以添加到下载队列中。

for ($urls as $url) {
    $pcurl->startRequest($url);
    usleep(100000);
}
于 2011-08-08T19:38:06.823 回答
3

不要以为你可以。如果你从 cli 运行它,你可以将你的脚本分成 10 个进程,然后从每个进程中触发常规 curl 请求。这将允许您对时间进行细粒度控制。

于 2011-08-08T19:27:41.467 回答
1

PHP 不是解决方案。分叉脚本也无济于事。一开始是的,但是一旦你有更多的网站,你需要像这样抓取你会发现自己作为你的服务器非常非常红。在成本和脚本稳定性方面,您应该重新考虑使用其他想法。

您可以使用 Python 轻松地做到这一点,并且在对 API 端点进行非阻塞实时调用的情况下,您应该使用 Socket.IO + Node.JS 或仅 Node.JS 之类的东西,嗯……哈哈

如果你没有时间也不会使用这样的东西:

http://framework.zend.com/manual/en/zendx.console.process.unix.overview.html

这实际上完全取决于您要实现的目标。

于 2011-08-10T04:42:28.770 回答
0

你可以试试这个:
在数据库中存储一个时间戳,添加一个句柄并调用curl_multi_exec.
用于CURLOPT_PROGRESSFUNCTION检查时间并在需要时添加更多句柄。
这里Daniel Stenberg(cURL 和 libcurl 的作者)说可以在执行curl_multi_exec.

于 2013-06-19T20:41:37.247 回答