当前位置: 首页 > 后端技术 > PHP

phpcurl优化下载微信头像

时间:2023-03-30 02:34:48 PHP

做过微信web开发的同学一定遇到过这样的需求。根据背景图生成用户宣传海报,需要有宣传二维码、用户头像、用户名等,应该是很常见的需求,使用php的gd库很容易合成,但是最近在生成这样的海报时,用了19s之久,最后发现问题出在远程拉取的微信头像上,所以解决方法有两种。方法一:提前下载好用户的微信头像,保存在自己的服务器上,但是我用的是七牛云,然后我的服务器存了一堆用户头像。我认为它太糟糕了,所以我放弃了它。方法2使用队列。因为使用了laravel,所以很容易把这个耗时的任务放到后台,自己运行。我刚开始用这个方法,后来发现如果用户操作很快,马上就到了生成海报这一步,可能队列还没有跑完,或者队列失败了。所以在一定程度上会给用户一种无知的感觉,并不是因为某种原因而产生的。方法三然后优化下载图片的速度。在stackoverflow上找了个帖子,《php - Get compressed contents using cURL》,里面说要给curl加一些参数,从而达到压缩传输的效果。我试过了,它确实有效。后来用了19多秒,变成了1.3s左右。简单写下代码(伪代码):基于laravel,使用laravel-wechat,图片处理使用intervention/image获取远程图片内容://curl不做错误处理staticpublicfunctiongetImage(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);返回$输出;}合成图像静态公共函数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");});$化身=伊玛ge::make(static::getImage($user->avatar))->resize(182,182);$img->insert($avatar,'左下角',95,200);$fileName=str_random(16).'.jpg';//可以保存到本地也可以上传到七牛$img->save($filePath,70);}当然搜了一下“为什么下载微信头像这么慢”,有很多大神分析跟dns分析的关系。可以先解析成ip,再设置curl参数。当然,解决问题的方法还有很多。使用intervention/image的坑可能有些人不会遇到,因为跟这个包没有关系,而是跟你自己的php环境有关。如果你自己升级了php版本,然后没有使用imagick,默认使用gd库,那么很有可能会遇到Calltoundefinedfunctionimagecreatefromjpeg(),不支持FreeType2等问题。后来,编译安装的过程中发现少了:--with-freetype-dir=DIR--with-jpeg-dir=DIR,所以重新编译php就可以了。当然,如果你不使用gd库,是没有问题的。intervention/image默认配置使用gd库,可以自行修改。参考文章http://php.net/manual/zh/imag...https://stackoverflow.com/que...https://stackoverflow.com/que...