3

有什么方法可以限制 CURL 获取的数据量吗?我正在从 50kb 的页面上抓取数据,但是我需要的数据位于页面的顶部 1/4,所以我真的只需要检索页面的前 10kb。

我之所以问,是因为我需要监控大量数据,这导致我每月传输近 60GB 的数据,而只有大约 5GB 的带宽是相关的。

我正在使用 PHP 来处理数据,但是我的数据检索方法很灵活,我可以使用 CURL、WGET、fopen 等。

我正在考虑的一种方法是

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

以上是否意味着我只会从 www.website.com 传输 6kb,或者 fopen 会将 www.website.com 加载到内存中意味着我仍将传输完整的 50kb?

4

4 回答 4

4

实际上,这更像是一个 HTTP 而不是一个 CURL 问题。

如您所料,如果您使用 fopen,将下载整个页面。不管你是否在偏移量 5000 处寻找。

实现您想要的最佳方法是使用部分 HTTP GET 请求,如 HTML RFC ( http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html ) 中所述:

如果请求消息包含 Range 标头字段,则 GET 方法的语义更改为“部分 GET”。部分 GET 请求仅传输实体的一部分,如第 14.35 节所述。部分 GET 方法旨在通过允许完成部分检索的实体而不传输客户端已经持有的数据来减少不必要的网络使用。

此处描述了使用 Ranges 的部分 GET 请求的详细信息:http: //www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

于 2009-10-08T16:37:08.913 回答
4

尝试HTTP RANGE 请求

GET /largefile.html HTTP/1.1
Range: bytes=0-6000

如果服务器支持范围请求,它将返回 206 Partial Content 响应代码,其中包含 Content-Range 标头和您请求的字节范围(如果不支持,它将返回 200 和整个文件)。有关范围请求的详细说明,请参见http://benramsey.com/archives/206-partial-content-and-range-requests/ 。

另请参阅使用 PHP 发送文件时的可恢复下载?.

于 2009-10-08T16:48:31.200 回答
2

您也可以使用 CURL 完成您正在寻找的内容。

如果您查看CURLOPT_WRITEFUNCTION的文档,您可以注册一个回调,只要数据可用于从 CURL 读取,就会调用该回调。然后您可以计算收到的字节数,当您收到超过 6,000 个字节时,您可以返回 0 以中止其余的传输。

libcurl文档对回调进行了更多描述:

一旦收到需要保存的数据,libcurl 就会调用此函数。返回实际处理的字节数。如果该金额与传递给您的函数的金额不同,它将向库发出错误信号,并将中止传输并返回 CURLE_WRITE_ERROR。

回调函数将在所有调用中传递尽可能多的数据,但您不可能做出任何假设。它可能是一个字节,也可能是数千个。

于 2009-10-08T17:43:37.877 回答
0

它将通过fopen调用下载整个页面,但随后它只会从该页面读取 6kb。

来自 PHP 手册:

只要满足以下条件之一,就会停止读取:

  • 已读取长度字节
于 2009-10-08T16:35:34.673 回答