入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

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

创建时间:2016-12-16 投稿人: 浏览次数:146

此事的起因是同事做微信投票,遇到一个问题。从微信服务器下载用户头像时极卡,平均在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。利用很小的代价,解决问题,多一次请求还是可行的。

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像