用过GD库的同学可能都知道,使用imagecreatetruecolor()函数创建一个真彩色的画布是第一步。但是,如果画布的宽高超过平常的宽高,会带来极大的内存消耗。比如,一个9600×4800的画布,会带来190M的内存消耗。这时,如果服务器的free空间过小,就会导致内存耗尽,出现各种报错。本文旨在提供优化服务器时对大图片的处理方法。

首先,说下业务场景。我要对用户上传的图片进行裁剪,变成我想要的宽高比。注意,是2:1这种宽高比。 因为用的服务器内存总共只有512M,处理小图片时还好,但是一旦接触到4M以上的图片文件,内存耗尽就成了一个block的点。它会引发nginx报502的错误,因为nginx无法从php-fpm那里获取到相应的值。报错日志:a client request body is buffered to a temporary file。3119133 recv() failed (104: Connection reset by peer) while reading response header from upstream 这里可以提供下,我使用GD库对图片进行处理时的内存占用情况的日志:

获取大小内存-1 376.12 kb

获取大小内存 4.98 mb

#这里使用了imagecreatetruecolor

获取大小内存2 192.53 mb 图片width:9600height4800

获取大小内存3 287.92 mb

获取大小内存4 287.92 mb

获取大小内存5 287.92 mb

获取大小内存6 100.38 mb

获取大小内存7 104.48 mb

#这里实行了最后一步,释放内存 获取大小内存+1 376.21 kb

可以看到,很明显的内存占用,关于图片宽高对内存的影响,网上有个公式:

(width*height)* 3 * 图片位数 //乘以3是因为创建的是rgb色彩模式的图像,有3个通道

可以看到,这仅仅是一个4M的图片,就对服务器提出了将近200M的消耗。当然这里不能仅仅用大小size来衡量,还要加入Width和Height来度量实际的大小。这也是我们处理图片上传时,为什么不仅要加入大小的限制 ,还要加入宽高的限制的原因所在。 我的解决方法是使用了一个第三方软件:imagemagick。 这里我要强推下这个软件,他可以把你的多张图片合成一个pdf,也可以将一个pdf转换成多张图片,而且可以对图片增加诸如炭笔,油画等特效。

#CentOs安装方法 yum install ImageMagick #测试安装成功 convert -v

因为是我个人使用,所以直接在upload的时候实时执行了以下命令。

$command = "convert -resize *x* 'images/a.jpg' 'images/a.jpg'"; $result = exec($command, $res, $code); #这里直接使用php的exec命令即可。对参数进行下简单说明。 #convert imagemagick的转换命令 #-resize 要执行的命令 #*x* 宽乘以高,这个是小写的x #*.jpg 原图位置 #*.jpg 转换后图片的名称,不改则默认覆盖原图

加上之后,内存的占用日志

获取大小内存-1 384.83 kb 获取大小内存 384.97 kb 获取大小内存+1 385.17 kb 执行命令convert -resize 3696x1848! images/20190213094940_940.jpg images/20190213094940_940.jpg #这里在高这里加上!是表示不接受imagemagick默认的等比缩放,强制转换成这个大小

可以看到,处理速度和内存占用都降了下来,这一步,将内存的压力转换成了Cpu的压力。

yoast造成php内存过大_解决PHP处理图片时内存占用过高问题相关推荐

  1. python 内存分析工具_[转] python运行时内存分析工具meliae

    meliae是一个python进程内存占用监控.分析工具,它的安装需要依赖pyrex包. 一.安装: 安装python内存分析工具 sudo pip install cython sudo pip i ...

  2. mysql5.6启动占用内存很大的解决方法

    mysql5.6启动占用内存很大的解决方法 参考文章: (1)mysql5.6启动占用内存很大的解决方法 (2)https://www.cnblogs.com/musings/p/5913225.ht ...

  3. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8解决导出大数据量excel文件时内存溢出的问题 参考文章: (1)POI3.8解决导出大数据量excel文件时内存溢出的问题 (2)https://www.cnblogs.com/feng ...

  4. Unity3D占用内存太大的解决方法【先转,慢慢看】

    2019独角兽企业重金招聘Python工程师标准>>> Unity3D占用内存太大的解决方法 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unit ...

  5. unity占内存大小_Unity3D占用内存太大的解决方法

    原文链接:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太 ...

  6. mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置

    mongodb 3.2配置内存缓存大小为MB/MongoDB 3.x内存限制配置 转载自勤奋的小青蛙 mongodb占用内存非常高,这是因为官方为了提升存储的效率,设计就这么设计的. 但是大部分的个人 ...

  7. python字典的存储结构_解决python字典结构内存暴涨问题

    背景:当读取一个key value数据的时候,python的字典结构会造成内存使用扩10倍左右,无可容忍.此文解决这个问题 数据:word2vec训练的结果,word对应400维的词向量.词表共1.6 ...

  8. Unity3D占用内存太大怎么解决呢? -尾

    Unity中的内存种类 实际上Unity游戏使用的内存一共有三种:程序代码.托管堆(Managed Heap)以及本机堆(Native Heap). 程序代码包括了所有的Unity引擎,使用的库,以及 ...

  9. linux运行java程序内存过大_排查java应用linux环境内存占用过高的问题

    一.问题场景 在一个短信平台的项目中,设置了一个下发节点的Xmx为16G,但是出现了内存撑满,导致CPU过高的情况.当时的具体情况是,该应用内存占用16G,该应用CPU占用1400%(16核),服务器 ...

  10. “系统资源不足,无法满足请求服务“ ,而内存够大,解决办法

    重装windows系统后,如果使用了某种激活工具,那么激活系统后,电脑用过一段时间后可能会出现这种情况.此时,点击其他应用程序会出现"系统资源不足,无法满足请求服务",点击&quo ...

最新文章

  1. android调服务不更新,android – OnUpdate()不调用小部件服务
  2. matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
  3. mysql数据库基础(密码策略)
  4. 你......真的了解我吗?
  5. 关于ViewPager使用出现的图片覆盖错误问题
  6. 推送ActivityFeed到Teams
  7. html用函数输出nn乘法表,第5讲 PHP编程.ppt
  8. System.Diagnostics.Process.Star的用法
  9. php日历排班表,日历排班表软件下载
  10. VirtualBox 4.3“不能为虚拟电脑 打开一个新任务”解决方案 - 转
  11. hashcat字典攻击
  12. mysql 联合查询_MySQL联合查询
  13. 秀米的对话框格子可以变大吗_如何使用秀米进行排版(对外版)课件.ppt
  14. python同一个包下不同文件的函数调用
  15. python 爬虫 表格,python爬虫爬取网页表格数据
  16. js 生成26个英文字母
  17. Linux基础学习Day2之基本概念及操作
  18. 数据库读写分离(单主单从+双主双从)
  19. VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程
  20. Hexo-零基础搭建个人博客(详解)

热门文章

  1. 阿里最新组织架构大轮岗,主要涉及HR线
  2. 我为什么建议你发年终奖前跳槽?
  3. 开发者生态与双引擎:华为的雄心壮志!
  4. 雷林鹏分享:Ruby 发送邮件 - SMATP
  5. js new到底干了什么,new的意义是什么?
  6. 123.static静态函数和函数模板
  7. 你看,那个人好像一条狗哎
  8. Visual Studio Code 配合 Node.js 轻松实现JS断点调试
  9. hdu 3506 Monkey Party 区间dp + 四边形不等式优化
  10. 17995 Stupid thief 组合数学