php curl 優化下載微信頭像

作過微信網頁開發的同窗確定遇到過這樣的需求,基於一張背景圖生成用戶推廣海報,上面須要有推廣二維碼、用戶頭像、用戶名稱等等。原本應該是一個很普通的需求,使用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...優化

https://stackoverflow.com/que...url

https://stackoverflow.com/que...

相關文章
相關標籤/搜索