有没有办法限制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,或者会将www.website.com加载到内存中,这意味着我仍然会传输完整的50kb?
答案 0 :(得分:4)
这更像是一个实际上是CURL问题的HTTP。
正如您所猜测的,如果您使用fopen,将会下载整个页面。无论如何你是否寻求抵消5000。
实现所需内容的最佳方法是使用部分HTTP GET请求,如HTML RFC(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)中所述:
GET方法的语义发生了变化 如果请求,则为“部分GET” 消息包括Range头字段。 部分GET请求只是部分 被转让的实体,如 在第14.35节中描述。该 部分GET方法旨在 减少不必要的网络使用量 允许部分检索的实体 完成而不转移 已经由客户持有的数据。
此处描述了使用范围的部分GET请求的详细信息: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2
答案 1 :(得分:3)
GET /largefile.html HTTP/1.1
Range: bytes=0-6000
if the server supports range requests,它将返回206 Partial Content响应代码,其中包含Content-Range标头和您请求的字节范围(如果没有,则返回200和整个文件)。有关范围请求的详细解释,请参阅http://benramsey.com/archives/206-partial-content-and-range-requests/。
答案 2 :(得分:2)
您也可以使用CURL完成您正在寻找的内容。
如果查看CURLOPT_WRITEFUNCTION的文档,只要有数据可供从CURL读取,就可以注册一个被调用的回调。然后,您可以计算接收的字节数,当您收到超过6,000个字节时,您可以返回0以中止传输的其余部分。
libcurl文档更多地描述了回调:
只要收到需要的数据,libcurl就会调用此函数 保存。返回字节数 实际上照顾好了。如果那个数额 与传递给您的金额不同 功能,它会发出错误信号 图书馆,它将中止转移 并返回CURLE_WRITE_ERROR。
将传递回调函数 尽可能多的数据 调用,但你不可能 任何假设。它可能是一个字节, 可能有数千人。
答案 3 :(得分:0)
它将通过fopen
调用下载整个页面,但之后只能从该页面读取6kb。
从PHP手册:
只要满足以下条件之一,读取就会停止:
- 长度字节已被读取