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的历史和优缺点
Oct 09 PHP
建立动态的WML站点(三)
Oct 09 PHP
php max_execution_time执行时间问题
Jul 17 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php分页示例分享
Apr 30 PHP
PHP使用mysqldump命令导出数据库
Apr 14 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
Jun 17 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 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中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
python实用代码片段收集贴
2015/06/03 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Django框架视图介绍与使用详解
2019/07/18 Python
ipad上运行python的方法步骤
2019/10/12 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
暑假家长评语大全
2014/04/17 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
讲文明倡议书
2015/04/29 职场文书
高一化学教学反思
2016/02/22 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS