php的curl如何使用head协议来获取资源的大小等信息?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

2016-06-12 16:19:54 2104 1

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

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

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

PHP
取消 提交回答
全部回答(1)
  • 落地花开啦
    2019-07-17 19:34:28

    其实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也不是必须的字段,你应该做到如果有这个值,而且超过了最大值,可以返回错误,如果没有这个值,或者没有超过最大值,就必须自己通过已经下载的内容大小来判断。

    至于你说的最大资源下载长度,我还没看到这个设置项,不过这个问题有一个更加美好的解决方案,那就是用到CURLOPT_HEADERFUNCTION和CURLOPT_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;
    0 0
相关问答

1

回答

如何为PHP启用mysqlnd??mysql

2020-05-17 17:38:53 318浏览量 回答数 1

1

回答

如何把MySQL表的列名输出到PHP页面显示?

2016-03-09 09:24:26 1914浏览量 回答数 1

1

回答

php+mysql中多关键字相似度查询的疑问

2016-02-15 10:38:45 2139浏览量 回答数 1

1

回答

php如何用rpm安装的mysql?

2016-02-14 14:28:49 1751浏览量 回答数 1

1

回答

php redis做mysql的缓存怎么异步redis同步到mysql数据库?

2016-02-13 14:54:31 6566浏览量 回答数 1

1

回答

centOS下PHP无法连接mysql

2016-02-13 10:56:33 2957浏览量 回答数 1

1

回答

sql语句,mysql下直接执行快,在php慢的问题

2016-02-13 10:53:30 2844浏览量 回答数 1

1

回答

相关php,mysql与map的问题

2016-02-13 10:35:28 1843浏览量 回答数 1

1

回答

PHP+ MySql数据库设计中的特殊要求查询如何实现

2016-02-12 16:52:00 1933浏览量 回答数 1

1

回答

PHP+MySQL数据排序问题

2016-02-12 15:03:11 2631浏览量 回答数 1
+关注
落地花开啦
喜欢技术,喜欢努力的人
文章
问答
问答排行榜
最热
最新
相关电子书
更多
复杂PHP系统性能瓶颈排查及优化
立即下载
PHP与APM_技术内幕和最佳实践
立即下载
PHP安全开发_从白帽角度做安全
立即下载