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

至於爲何會出現這種現象,本身也沒搞清楚,但這無疑是一點比較有用且小衆的經驗。

相關文章
相關標籤/搜索