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中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2