php curl 在不读取完整图片的情况下获取图片大小

2024-06-09 10:18

本文主要是介绍php curl 在不读取完整图片的情况下获取图片大小,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此事的起因是同事做微信投票,遇到一个问题。从微信服务器下载用户头像时极卡,平均在1分钟左右。图片才十几k而已。当时用的是file_get_contents函数,我分析有可能是微信头像的地址没有图片格式或者服务器的问题,导致file_get_contents不知道什么时候结束。所以用curl改造了一个方法,先通过头信息获取图片大小,然后用file_get_contents指定获取字节。事实证明可行,速度极快,而且图片完整。

ps:对于服务器设置不返回文件大小这种方法就无效了。


function getUriLen($uri,$user='',$pw='')
{	ob_start();$ch = curl_init($uri);curl_setopt($ch, CURLOPT_HEADER, 1);curl_setopt($ch, CURLOPT_NOBODY, 1);  //nobody是关键if (!empty($user) && !empty($pw)){$headers = array('Authorization: Basic ' . base64_encode($user.':'.$pw));curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);}$okay = curl_exec($ch);curl_close($ch);$head = ob_get_contents();ob_end_clean();$regex = '/Content-Length:\s+(.+)/';preg_match($regex, $head, $matches);print_r("<pre>");print_r ($head);print_r ($matches);print_r("</pre>");return $matches[1]; 
}$url = "http://avatar.csdn.net/8/E/F/3_u011478276.jpg";
$len = getUriLen($url);
$a = file_get_contents($url,null,null,0,$len);echo $a;


测试图片为我的头像,header信息如下

HTTP/1.1 200 OK
Server: Tengine
Content-Type: image/jpeg
Content-Length: 13020
Connection: keep-alive
Date: Fri, 16 Dec 2016 01:02:36 GMT
x-oss-request-id: 58533D2C6C6742DF40F6EBE5
Accept-Ranges: bytes
ETag: "77454815F646118A95F09CCA45E65232"
Last-Modified: Fri, 16 Dec 2016 01:01:22 GMT
x-oss-object-type: Normal
x-oss-hash-crc64ecma: 14417696360285702792
Cache-Control: max-age=86400
Content-MD5: d0VIFfZGEYqV8JzKReZSMg==
x-oss-server-time: 4
Via: cache19.l2nu17[0,200-0,H], cache7.l2nu17[0,0], kunlun4.cn386[0,200-0,H], kunlun4.cn386[0,0]
Age: 21102
X-Cache: HIT TCP_MEM_HIT dirn:9:781590905
X-Swift-SaveTime: Fri, 16 Dec 2016 02:47:19 GMT
X-Swift-CacheTime: 31104000
Access-Control-Allow-Origin: http://my.csdn.net
Timing-Allow-Origin: *
EagleId: ca61e70414818712586162101e

函数获取图片大小的报头

Cache-Control:max-age=0
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:657
Content-Type:text/html; charset=utf-8
Date:Fri, 16 Dec 2016 06:57:33 GMT
Expires:Fri, 16 Dec 2016 06:57:33 GMT
Keep-Alive:timeout=5, max=100
Server:Apache

Vary:Accept-Encoding


根据两个报头可见,图片为13k,获取图片大小的请求不到1k。利用很小的代价,解决问题,多一次请求还是可行的。

这篇关于php curl 在不读取完整图片的情况下获取图片大小的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044899

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os