事实上 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);
上面这段代码使用 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 多倍。rem
至于为何会出现这种现象,本身也没搞清楚,但这无疑是一点比较有用且小众的经验。