其实intervention/iamge处理的时间比较长。它的api设计很简单,文档也很全面,相当好用。不过最近无意中发现了一个小坑。因为需要合成一个带有微信头像的二维码,所以我使用Image::make($avatarUrl)(其中$avatarUrl为微信头像链接)生成头像,然后合成为二维码图片(包括其他一些操作,比如使用模板背景,写文字)。写完之后发现运行起来还是挺慢的,平均需要23秒左右。一开始以为是合成过程中操作比较多,体积比较大,所以应该是这个速度。但后来我有空,开始尝试优化。就算不能提高速度,至少我能弄清楚为什么这么耗时。经过这一番折腾,发现真相与合成操作的数量和大小无关。关键在于我创建头像数据的姿势。为了说明这个问题,我特意写了下面的代码进行对比。//记录开始时间$startTimestamp=microtime(true);$url='http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/ar0'(Record::m::m)结束时间$endTimetrustamp=microtime();信息($startTimestamp);信息($endTimestamp);信息($endTimestamp-$startTimestamp);上面的代码使用Image::make($url)的形式直接从url生成头像。从记录的日志数据来看,耗时基本在16秒左右。后来我想到了一个新的姿势,其实也是我在尝试优化的时候想到的。见下面代码:$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);信息($endTimestamp-$startTimestamp);这里我先使用GuzzleHttp获取头像,然后使用Image::make($data)创建头像。注意,快高潮了……看下面的日志截图,3次平均耗时0.07秒左右,比之前的16秒差了200多倍。至于为什么会出现这种现象,我自己也没有搞清楚,但这无疑是一个有用且小众的体验。
