php curl優(yōu)化下載微信頭像的方法總結(jié)
curl是什么
百度百科給的解釋是:數(shù)據(jù)傳輸神器。那它神器在什么地方那,通過(guò)查找資料得出curl可以使用url的語(yǔ)法模擬瀏覽器來(lái)傳輸數(shù)據(jù),因?yàn)槭悄M瀏覽器所以它支持多種的網(wǎng)絡(luò)協(xié)議。目前支持http、https、ftp、gopher、telnet、dict、file和ldap協(xié)議。libcurl同時(shí)也支持HTTPS認(rèn)證、HTTP POST、HTTP PUT、 FTP 上傳(這個(gè)也能通過(guò)PHP的FTP擴(kuò)展完成)、HTTP 基于表單的上傳、代理、cookies和用戶(hù)名+密碼的認(rèn)證。
php中使用最多的是通過(guò)curl來(lái)模擬get和post請(qǐng)求。
引言
做過(guò)微信網(wǎng)頁(yè)開(kāi)發(fā)的同學(xué)肯定遇到過(guò)這樣的需求,基于一張背景圖生成用戶(hù)推廣海報(bào),上面需要有推廣二維碼、用戶(hù)頭像、用戶(hù)名稱(chēng)等等。本來(lái)應(yīng)該是一個(gè)很普通的需求,使用php的gd庫(kù)就很容易合成,但是最近在生成這樣海報(bào)的時(shí)候,發(fā)現(xiàn)時(shí)間長(zhǎng)達(dá)19s,最后發(fā)現(xiàn)問(wèn)題卡在遠(yuǎn)程拉去微信頭像上,所以解決辦法有兩個(gè)。
方法一
提前把用戶(hù)微信頭像下載下來(lái)保存在自己的服務(wù)器上,不過(guò)我使用七牛云,然后自己服務(wù)器又保存一堆用戶(hù)頭像,覺(jué)得太糟糕了,所以?huà)仐墶?/p>
方法二
使用隊(duì)列,因?yàn)槭褂胠aravel,所以很容易就可以把這種費(fèi)時(shí)的任務(wù)放到后臺(tái),自己去跑吧。剛開(kāi)始采用這種方法,后來(lái)發(fā)現(xiàn),如果用戶(hù)操作很快,一下就跑到生成海報(bào)的那一步,可能隊(duì)列還沒(méi)有跑完,或者隊(duì)列失敗了。所以某種程度上會(huì)給用戶(hù)一種懵逼的感覺(jué),不知道怎么就沒(méi)有生成。
方法三
那就優(yōu)化一下下載圖片的速度好了。
在stackoverflow上找到一個(gè)帖子,《php - Get compressed contents using cURL》,里面說(shuō)到給curl加一下參數(shù),從而達(dá)到壓縮傳輸?shù)淖饔茫嚵艘幌?,果然起作用,又后?lái)的19s多,變成了1.3s左右。
簡(jiǎn)單寫(xiě)一下代碼(偽代碼):
基于laravel,使用了laravel-wechat, 圖片處理使用intervention/image
獲取遠(yuǎn)程圖片內(nèi)容:
//curl 沒(méi)有做錯(cuò)誤處理
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, ""); //加速 這個(gè)地方留空就可以了
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'); //字體設(shè)置
$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);
}
當(dāng)然了,我搜了一下“為什么下載微信頭像會(huì)這么慢”,有很多大神分析和dns解析有關(guān)系,可以先解析成ip,然后在設(shè)置curl參數(shù),當(dāng)然也可以。解決問(wèn)題方式其實(shí)還是挺多的。
使用intervention/image的坑
這個(gè)坑可能有的人不會(huì)遇到,因?yàn)楹瓦@個(gè)package無(wú)關(guān),而是和自己的php環(huán)境有關(guān)
如果你自己升級(jí)過(guò)php版本,然后沒(méi)有使用imagick,默認(rèn)使用gd庫(kù),那么很有可能中遇到Call to undefined function imagecreatefromjpeg()和不支持FreeType 2等一些問(wèn)題。后來(lái)才知道編譯安裝過(guò)程中少了:
--with-freetype-dir=DIR --with-jpeg-dir=DIR
所以重新編譯php就可以了。當(dāng)然如果你不使用gd庫(kù)的話(huà),那就不會(huì)出問(wèn)題了,intervention/image默認(rèn)配置使用的就是gd庫(kù),可以自己修改。
參考文章
http://php.net/manual/zh/imag...
https://stackoverflow.com/que...
https://stackoverflow.com/que...
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
PHP中使用jQuery+Ajax實(shí)現(xiàn)分頁(yè)查詢(xún)多功能操作(示例講解)
下面小編就為大家?guī)?lái)一篇PHP中使用jQuery+Ajax實(shí)現(xiàn)分頁(yè)查詢(xún)多功能操作(示例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
PHP 截取字符串函數(shù)整理(支持gb2312和utf-8)
常見(jiàn)的 PHP 截取字符串函數(shù)整理,支持gb2312和utf-8編碼,方法php開(kāi)發(fā)中需要用到截取字符串的問(wèn)題。2010-02-02
Json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法
json_encode通常會(huì)把json中的漢字轉(zhuǎn)義成unicode,但是有些時(shí)候不是我們想要的,下面小編給大家介紹json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法,需要的朋友參考下吧2016-02-02
PHP對(duì)象的淺復(fù)制與深復(fù)制的實(shí)例詳解
這篇文章主要介紹了PHP對(duì)象的淺復(fù)制與深復(fù)制的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
PHP實(shí)現(xiàn)的激活用戶(hù)注冊(cè)驗(yàn)證郵箱功能示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的激活用戶(hù)注冊(cè)驗(yàn)證郵箱功能,詳細(xì)分析了php郵件激活用戶(hù)所涉及的數(shù)據(jù)庫(kù)、郵件相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
在PHP中使用curl_init函數(shù)的說(shuō)明
在這篇文章中主要講解php_curl庫(kù)的知識(shí),并教你如何更好的使用php_curl。2010-11-11
WordPres對(duì)前端頁(yè)面調(diào)試時(shí)的兩個(gè)PHP函數(shù)使用小技巧
這篇文章主要介紹了WordPres對(duì)前端頁(yè)面調(diào)試時(shí)的兩個(gè)PHP函數(shù)使用小技巧,分別是過(guò)濾Html內(nèi)嵌JavaScript與禁止瀏覽器緩存的方法,需要的朋友可以參考下2015-12-12

