0

0

http - php的curl如何使用head协议来获取资源的大小等信息

php中文网

php中文网

发布时间:2016-06-06 20:51:42

|

1448人浏览过

|

来源于php中文网

原创

我的程序里允许用户填写网址从其它网站抓取资源,但是在抓取之前我要知道资源的大小,要不然资源太大耗时太长也会占用不必要的带宽。我查到了http里面有head这个协议,就是只获取一个资源的http头部信息,那么在curl里怎么只获取http的头而不下载全部body呢?

还有content-length是所有的http头部信息里必须都有的吗,因为我只有这个办法来获取资源大小了。如果没有这个信息,我想用一个替代方法,就是设置curl下载资源的最大长度,如果超过了就中断连接,然后报错。在curl有达到此类效果的选项吗?

最后问一点,各大服务器对HEAD协议支持情况如何呢?

回复内容:

我的程序里允许用户填写网址从其它网站抓取资源,但是在抓取之前我要知道资源的大小,要不然资源太大耗时太长也会占用不必要的带宽。我查到了http里面有head这个协议,就是只获取一个资源的http头部信息,那么在curl里怎么只获取http的头而不下载全部body呢?

还有content-length是所有的http头部信息里必须都有的吗,因为我只有这个办法来获取资源大小了。如果没有这个信息,我想用一个替代方法,就是设置curl下载资源的最大长度,如果超过了就中断连接,然后报错。在curl有达到此类效果的选项吗?

立即学习PHP免费学习笔记(深入)”;

最后问一点,各大服务器对HEAD协议支持情况如何呢?

其实curl里面早就有对HEAD协议的支持

// 只需要在你的代码中加上这样一行,就会自动选择head协议
curl_setopt($ch, CURLOPT_NOBODY, true);

如果你要读取Content-Length,那么只需要在curl_exec

// 读取的header里的Content-Length值
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

需要说明的是HEAD协议虽然被大部分服务器支持,但也不是说所有的服务器都支持,有的服务器为了防抓取,在设置中干掉了这个协议。而Content-Length也不是必须的字段,你应该做到如果有这个值,而且超过了最大值,可以返回错误,如果没有这个值,或者没有超过最大值,就必须自己通过已经下载的内容大小来判断。

绘蛙AI修图
绘蛙AI修图

绘蛙平台AI修图工具,支持手脚修复、商品重绘、AI扩图、AI换色

下载

至于你说的最大资源下载长度,我还没看到这个设置项,不过这个问题有一个更加美好的解决方案,那就是用到CURLOPT_HEADERFUNCTIONCURLOPT_WRITEFUNCTION两个回调,那么就只需要一次请求即可完成所有的判断,而且可以随时断掉

$size = 0;
$max_size = 123456;

curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($ch, $str) {
	// 第一个参数是curl资源,第二个参数是每一行独立的header!
    list ($name, $value) = array_map('trim', explode(':', $str, 2));
    $name = strtolower($name);
    
    // 判断大小啦
    if ('content-length' == $name) {
    	if ($value > $max_size) {
        	return 0;	// 返回0就会中断读取
        }
    }
});

// 对于没有content-length的,我们一边读取一边判断
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $str) use (&$size) {
	$len = strlen($str);
    $size += $len;
    
    if ($size > $max_size) {
    	return 0;	// 中断读取
    }
    
    return $len;
});

为什么要用curl呢?直接用fsockopen往那边发一个head请求就行了。

不过head请求不一定会返回资源的大小,这个似乎不是可以保证的。

curl_setopt($curl, CURLOPT_HEADER, true);

curl_exec返回的结果中也就包含了HTTP response header,其中抽取 Content-Length 值就可以了

HTTP/1.1 200 OK
Server: Apache
Content-Type: text/html
Content-Encoding: gzip
Content-Length: 26395

这个长度值不可靠,服务器后端脚本可以任意修改该值。

设置最大抓取大小不就行了。远程服务器并不可信,给出的Content-Length并不一定是真实大小。为了防止被滥用,你也得去加上大小限制。

同时你可以做一个额外判断,比如说某个域名经常返回Content-Length与实际不一致的内容,就给它一个比较低的reputation。用户如果提交reputation低的域名的资源抓取需求,可以延迟或低优先级处理。

加上最大执行时间控制就好了吧,Curl是可以控制超时时间的。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

26

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

28

2025.12.30

PS反选快捷键
PS反选快捷键

本专题整合了ps反选快捷键介绍,阅读下面的文章找到答案。

25

2025.12.30

表格中一行两行的方法
表格中一行两行的方法

本专题整合了表格中一行两行的相关教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

cpu温度过高解决方法大全
cpu温度过高解决方法大全

本专题整合了cpu温度过高相关教程,阅读专题下面的文章了解更多详细内容。

5

2025.12.30

ASCII码介绍
ASCII码介绍

本专题整合了ASCII码相关内容,阅读专题下面的文章了解更多详细内容。

31

2025.12.30

GPS是什么
GPS是什么

本专题整合了GPS相关内容,阅读专题下面的文章了解更多详细内容。

3

2025.12.30

wifi拒绝接入
wifi拒绝接入

本专题整合了wifi拒绝接入相关教程,阅读下面的文章了解更多详细方法。

9

2025.12.30

丰网速运介绍
丰网速运介绍

本专题整合了丰网速运查询入口以及相关内容,阅读专题下面的文章了解更多内容。

3

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号