intervention/image 中的一个小坑及其破解之法

事实上 intervention/iamge 用了颇有些时日了,它的 api 设计得很简洁,文档也很全面,用起来至关顺手。php

不过最近无心间发现了一个小坑。由于须要合成带微信头像的二维码,我使用 Image::make($avatarUrl) (这里的 $avatarUrl 是微信头像的连接)来产生头像,而后合成到二维码图像中去(还包括一些其它操做,好比使用模板背景、写入文字)。api

写完以后一运行,发现至关慢,平均耗时 23 秒左右。起初觉得是由于合成过程当中进行的操做比较多、尺寸比较大,原本就应该是这个速度。不事后来闲下来,开始试着优化,即便不能提高速度,至少也搞清楚究竟是什么缘由这么耗时。微信

这一通折腾下来,发现真相居然与合成操做的多少、尺寸没有多大关系。而关键在于我建立头像数据的姿式。优化

为了说明这个问题,特地写了下面的代码进行对比。url

// 记录开始时间
$startTimestamp = microtime(true);

$url = 'http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0';

$avatar = \Image::make($url);

// 记录结束时间
$endTimestamp = microtime(true);

info($startTimestamp);
info($endTimestamp);
info($endTimestamp - $startTimestamp);

file

上面这段代码使用 Image::make($url) 的形式,直接从 url 生成头像。从记录的日志数据来看,耗时基本上在 16 秒左右。spa

后来,想到了一个新姿式,其实也就是在尝试优化的过程当中折腾时想到的。见下面代码:设计

$startTimestamp = microtime(true);

$client = new \GuzzleHttp\Client();

$url = 'http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0';

$avatarResponse = $client->get($url);

$avatar = \Image::make($avatarResponse->getBody()->getContents());

$endTimestamp = microtime(true);

info($startTimestamp);
info($endTimestamp);
info($endTimestamp - $startTimestamp);

在这里我先使用 GuzzleHttp 获取头像,再使用 Image::make($data) 建立头像。日志

注意,要高潮了…… code

看看下面的日志截图,三次平均耗时在 0.07 秒左右,和前面的 16 秒相比,差了 200 多倍。
filerem

至于为何会出现这种现象,本身也没搞清楚,但这无疑是一点比较有用且小众的经验。

相关文章
相关标签/搜索