作過微信網頁開發的同窗確定遇到過這樣的需求,基於一張背景圖生成用戶推廣海報,上面須要有推廣二維碼、用戶頭像、用戶名稱等等。原本應該是一個很普通的需求,使用php的gd庫就很容易合成,可是最近在生成這樣海報的時候,發現時間長達19s,最後發現問題卡在遠程拉去微信頭像上,因此解決辦法有兩個。
提早把用戶微信頭像下載下來保存在本身的服務器上,不過我使用七牛雲,而後本身服務器又保存一堆用戶頭像,以爲太糟糕了,因此拋棄。php
使用隊列,由於使用laravel
,因此很容易就能夠把這種費時的任務放到後臺,本身去跑吧。剛開始採用這種方法,後來發現,若是用戶操做很快,一下就跑到生成海報的那一步,可能隊列尚未跑完,或者隊列失敗了。因此某種程度上會給用戶一種懵逼的感受,不知道怎麼就沒有生成。laravel
那就優化一下下載圖片的速度好了。
在stackoverflow
上找到一個帖子,《php - Get compressed contents using cURL》,裏面說到給curl加一下參數,從而達到壓縮傳輸的做用,試了一下,果真起做用,又後來的19s多,變成了1.3s左右。服務器
簡單寫一下代碼(僞代碼):微信
基於laravel
,使用了laravel-wechat
, 圖片處理使用intervention/image
獲取遠程圖片內容:dom
//curl 沒有作錯誤處理 static public function getImage(string $url ) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_ENCODING, ""); //加速 這個地方留空就能夠了 curl_setopt($ch, CURLOPT_HEADER, 0); $output = curl_exec($ch); curl_close($ch); return $output; }
合成圖片
static public function poster(User $user, Activity $activity ) { $img = Image::make(public_path() . $activity->poster_base_img_url); //$img = Image::make(public_path() .'/wechat.jpg'); $img->text( $user->nickname, 180, 1060, function( $font ) { $font->file(public_path() . '/simhei.ttf'); //字體設置 $font->size(28); $font->color('#fff'); $font->align("center"); } ); $avatar = Image::make(static::getImage($user->avatar))->resize(182, 182); $img->insert($avatar, 'bottom-left', 95, 200); $fileName = str_random(16) . '.jpg'; //能夠保存到本地,或者上傳到七牛 $img->save($filePath, 70); }
固然了,我搜了一下「爲何下載微信頭像會這麼慢」,有不少大神分析和dns解析有關係,能夠先解析成ip,而後在設置curl參數,固然也能夠。解決問題方式其實仍是挺多的。curl
intervention/image
的坑這個坑可能有的人不會遇到,由於和這個package無關,而是和本身的php環境有關
若是你本身升級過php
版本,而後沒有使用imagick
,默認使用gd
庫,那麼頗有可能中遇到Call to undefined function imagecreatefromjpeg()
和不支持FreeType 2
等一些問題。後來才知道編譯安裝過程當中少了:post
--with-freetype-dir=DIR --with-jpeg-dir=DIR
因此從新編譯php就能夠了。固然若是你不使用gd
庫的話,那就不會出問題了,intervention/image
默認配置使用的就是gd
庫,能夠本身修改。字體
http://php.net/manual/zh/imag...優化