事實上 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
至於爲何會出現這種現象,本身也沒搞清楚,但這無疑是一點比較有用且小衆的經驗。