资讯专栏INFORMATION COLUMN

intervention/image 中的一个小坑及其破解之法

wangzy2019 / 1472人阅读

摘要:不过最近无意间发现了一个小坑。写完之后一运行,发现相当慢,平均耗时秒左右。起初以为是因为合成过程中进行的操作比较多尺寸比较大,本来就应该是这个速度。这一通折腾下来,发现真相竟然与合成操作的多少尺寸没有多大关系。

事实上 intervention/iamge 用了很有些时日了,它的 api 设计得很简洁,文档也很全面,用起来相当顺手。

不过最近无意间发现了一个小坑。因为需要合成带微信头像的二维码,我使用 Image::make($avatarUrl) (这里的 $avatarUrl 是微信头像的链接)来产生头像,然后合成到二维码图像中去(还包括一些其它操作,比如使用模板背景、写入文字)。

写完之后一运行,发现相当慢,平均耗时 23 秒左右。起初以为是因为合成过程中进行的操作比较多、尺寸比较大,本来就应该是这个速度。不过后来闲下来,开始试着优化,即使不能提升速度,至少也搞清楚到底是什么原因这么耗时。

这一通折腾下来,发现真相竟然与合成操作的多少、尺寸没有多大关系。而关键在于我创建头像数据的姿势。

为了说明这个问题,特意写了下面的代码进行对比。

// 记录开始时间
$startTimestamp = microtime(true);

$url = "http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0";

$avatar = Image::make($url);

// 记录结束时间
$endTimestamp = microtime(true);

info($startTimestamp);
info($endTimestamp);
info($endTimestamp - $startTimestamp);

上面这段代码使用 Image::make($url) 的形式,直接从 url 生成头像。从记录的日志数据来看,耗时基本上在 16 秒左右。

后来,想到了一个新姿势,其实也就是在尝试优化的过程中折腾时想到的。见下面代码:

$startTimestamp = microtime(true);

$client = new GuzzleHttpClient();

$url = "http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0";

$avatarResponse = $client->get($url);

$avatar = Image::make($avatarResponse->getBody()->getContents());

$endTimestamp = microtime(true);

info($startTimestamp);
info($endTimestamp);
info($endTimestamp - $startTimestamp);

在这里我先使用 GuzzleHttp 获取头像,再使用 Image::make($data) 创建头像。

注意,要高潮了……

看看下面的日志截图,三次平均耗时在 0.07 秒左右,和前面的 16 秒相比,差了 200 多倍。

至于为什么会出现这种现象,自己也没搞清楚,但这无疑是一点比较有用且小众的经验。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26075.html

相关文章

  • Intervention/image 图片处理扩展包的安装和使用

    摘要:本文经授权转自社区说明是为定制的图片处理工具它提供了一套易于表达的方式来创建编辑图片。 本文经授权转自 PHPHub 社区 说明 Intervention/image 是为 Laravel 定制的图片处理工具, 它提供了一套易于表达的方式来创建、编辑图片。 本文章由 The EST Group 成员 @monkey 撰写, 首发地为 PHPHub 社区. Demo 代码请见:https...

    princekin 评论0 收藏0
  • Yii 使用intervention/image拓展实现图像处理

    摘要:一安装拓展二上传文件为上传表单的名为上传表单的名并将上传的图片压缩成同时实现单图上传和多图上传多图上传单图上传三添加水印添加文字水印添加文字水印主要使用到方法方法参数说明可选定义第一个字符的基点。默认值可选定义第一个字符的基点。 一:安装intervention/image拓展 composer require intervention/image 二:上传文件 Interventi...

    leoperfect 评论0 收藏0
  • php curl 优化下载微信头像

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

    ZweiZhao 评论0 收藏0
  • 在Laravel项目中实现Ajax上传用户头像

    摘要:在编写程序的过程中,经常会遇到一个经典的文件上传场景上传头像图片。基于对最好的用户体验的追求,写一下之前在项目中实现在项目中的上传头像。 在编写web程序的过程中,经常会遇到一个经典的文件上传场景:上传头像(图片)。基于对最好的用户体验的追求,写一下之前在项目中实现在Laravel项目中的Ajax上传头像。 1.配置路由 在Laravel的routes.php中设置路由: Rou...

    shiina 评论0 收藏0
  • laravel开发扩展记录

    摘要:自动代码扩展开发时遵守的代码风格是项目开发规范。遵照此规范,在实际操作中,有许多重复,接下来推荐一款专为此规范量身定制的代码生成器。可以利用此扩展来快速构建项目原型。后续还会为大家带来一些最新的技术扩展。 whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置。laravel默认安装。showImg(https://s...

    fancyLuo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<