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 radio 单选框获取与保持值的实现代码
May 15 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
PHP中判断变量为空的几种方法分享
Aug 26 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
Jul 11 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
php实现文件上传及头像预览功能
Jan 15 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
PHP判断是否是微信打开还是浏览器打开的方法
Feb 27 PHP
php实现商城购物车的思路和源码分析
Jul 23 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
基于python中theano库的线性回归
2018/08/31 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
完美解决pycharm导入自己写的py文件爆红问题
2020/02/12 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
python 自动识别并连接串口的实现
2021/01/19 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
美国时尚女装在线:Missguided
2016/12/03 全球购物
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
活动总结怎么写啊
2014/05/07 职场文书
春季防火方案
2014/05/10 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
爱国电影观后感
2015/06/19 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers