php curl优化下载微信头像的方法总结


Posted in PHP onSeptember 07, 2018

curl是什么

百度百科给的解释是:数据传输神器。那它神器在什么地方那,通过查找资料得出curl可以使用url的语法模拟浏览器来传输数据,因为是模拟浏览器所以它支持多种的网络协议。目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。

php中使用最多的是通过curl来模拟get和post请求。

引言

做过微信网页开发的同学肯定遇到过这样的需求,基于一张背景图生成用户推广海报,上面需要有推广二维码、用户头像、用户名称等等。本来应该是一个很普通的需求,使用php的gd库就很容易合成,但是最近在生成这样海报的时候,发现时间长达19s,最后发现问题卡在远程拉去微信头像上,所以解决办法有两个。

方法一

提前把用户微信头像下载下来保存在自己的服务器上,不过我使用七牛云,然后自己服务器又保存一堆用户头像,觉得太糟糕了,所以抛弃。

方法二

使用队列,因为使用laravel,所以很容易就可以把这种费时的任务放到后台,自己去跑吧。刚开始采用这种方法,后来发现,如果用户操作很快,一下就跑到生成海报的那一步,可能队列还没有跑完,或者队列失败了。所以某种程度上会给用户一种懵逼的感觉,不知道怎么就没有生成。

方法三

那就优化一下下载图片的速度好了。

在stackoverflow上找到一个帖子,《php - Get compressed contents using cURL》,里面说到给curl加一下参数,从而达到压缩传输的作用,试了一下,果然起作用,又后来的19s多,变成了1.3s左右。

简单写一下代码(伪代码):

基于laravel,使用了laravel-wechat, 图片处理使用intervention/image

获取远程图片内容:

//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参数,当然也可以。解决问题方式其实还是挺多的。

使用intervention/image的坑

这个坑可能有的人不会遇到,因为和这个package无关,而是和自己的php环境有关
如果你自己升级过php版本,然后没有使用imagick,默认使用gd库,那么很有可能中遇到Call to undefined function imagecreatefromjpeg()和不支持FreeType 2等一些问题。后来才知道编译安装过程中少了:

--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...

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP 日常开发小技巧
Sep 23 PHP
PHP企业级应用之常见缓存技术篇
Jan 27 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
探讨多键值cookie(php中cookie存取数组)的详解
Jun 06 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
php提交post数组参数实例分析
Dec 17 PHP
CodeIgniter视图使用注意事项
Jan 20 PHP
php实现无限级分类查询(递归、非递归)
Mar 10 PHP
PHP 读取大文件并显示的简单实例(推荐)
Aug 12 PHP
Laravel框架模板继承操作示例
Jun 11 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
PHP中的异常处理机制深入讲解
Nov 10 PHP
Yii1.1框架实现PHP极光推送消息通知功能
Sep 06 #PHP
PHP日志LOG类定义与用法示例
Sep 06 #PHP
PHP实现断点续传乱序合并文件的方法
Sep 06 #PHP
php JWT在web端中的使用方法教程
Sep 06 #PHP
php进程daemon化的正确实现方法
Sep 06 #PHP
让Laravel API永远返回JSON格式响应的方法示例
Sep 05 #PHP
thinkPHP框架实现类似java过滤器的简单方法示例
Sep 05 #PHP
You might like
php实现可逆加密的方法
2015/08/11 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
基于mpvue的小程序项目搭建的步骤
2018/05/22 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
2019/03/27 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
浅析Python3爬虫登录模拟
2018/02/07 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Python处理session的方法整理
2019/08/29 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
车间工艺员岗位职责
2013/12/09 职场文书
法学专业自我鉴定
2014/02/05 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
违纪开除通知书
2015/04/25 职场文书
培训心得体会怎么写
2016/01/25 职场文书
60条职场经典语录,总有一条能触动你的心
2019/08/21 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL