技术饭
php函数getimagesize()函数获取腾讯云对象存储图片信息太慢解决办法
php函数getimagesize()函数获取腾讯云对象存储图片信息太慢,导致接口返回超过了5s,这个体验太不好了,按照正常逻辑:想获取图片信息,当然是用getimagesize()函数,对于getimagesize()函数而言本地服务器的文件读取相对是比较快的,但是远程的图片就太慢了,必须先现在到本地服务器,然后再获取,如果有的图片很大,那这个下载速度可想而知的慢。
那么猜想如果远程图片能够提供图片信息的接口那么直接请求接口不就好了么,果然腾讯云的对象存储确实提供了这个功能,他们的逻辑肯定也是文件在他服务器那边,读取数据自然快,然后通过接口直接返回给第三方,只要在图片url后面加上 ?imageInfo 即可返回对应的json数据。
腾讯云参考文档:https://cloud.tencent.com/document/product/436/44889
由于这个处理方法是用在数据列表的时候,分页数量大概在15条左右,也就是必须处理15次才能把图片数据返回来,但是foreach的循环使用curl、file_get_contents()只能减少一半的加载时间,也就是大概请求15条数据也得花费2.7s左右,但是这个时间还是不够理想,最后测试了一遍,foreach循环每次都初始化了curl导致加载慢了,只要把初始化部分代码提出来就达到了优化的效果,执行时间减到了500ms左右。
代码:
//初始化curl
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_HEADER, FALSE) ;
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
//处理数据
if (!empty($data['data'])) {
foreach ($data['data'] as $key => $value) {
//图标
if (isset($value['thumb']) && !empty($value['thumb'])) {
$thumb = unserialize($value['thumb']);
if (isset($thumb) && !empty($thumb[0]['thumb'])) {
$img_domain = config("img.domain");
$thumb[0]['thumb'] = $img_domain . $thumb[0]['thumb'];
$thumb[0]['photo'] = $img_domain . $thumb[0]['photo'];
//获取图片的信息
$thumb[0]['width'] = "?";
$thumb[0]['height'] = "?";
//$photo_info = https_get($thumb[0]['photo'] . '?imageInfo'); //这个一直初始化curl的方式执行时间大概是2.7s,file_get_contents()也差不多
curl_setopt($curl, CURLOPT_URL, $thumb[0]['photo'] . '?imageInfo'); //改成curl方式
if(curl_errno($curl)) {
$photo_info = '';
} else {
$photo_info = curl_exec($curl);
}
if(!empty($photo_info)){
$photo_info = object_to_array(json_decode($photo_info, true));
$thumb[0]['width'] = $photo_info['width'];
$thumb[0]['height'] = $photo_info['height'];
$thumb[0]['size'] = $photo_info['size'];
}
}
$data['data'][$key]['thumb'] = $thumb;
// try {
// $size = getimagesize($thumb[0]['photo']); //原始方式
// $data['data'][$key]['thumb'][0]['width'] = $size[0];
// $data['data'][$key]['thumb'][0]['height'] = $size[1];
// } catch (Exception $e) {
// $data['data'][$key]['thumb'][0]['width'] = "?";
// $data['data'][$key]['thumb'][0]['height'] = "?";
// }
}
}
}
curl_close($curl);
或者可以把curl的方式做了一个类似单例的方法,初始化curl方法只执行一次即可。
当然获取图片信息可以在图片上传后直接获取图片信息,直接保存起来,这样就不需要每次都要计算了。
文明上网理性发言!