解决PHP处理图片时内存占用过高问题
用过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的压力。
解决PHP处理图片时内存占用过高问题的更多相关文章
- 通过修改my.ini配置文件来解决MySQL 5.6 内存占用过高的问题
打开后台进程发现mysql占用的内存达到400+M. 修改一下my.ini这个配置文件的配置选项是可以限制MySQL5.6内存占用过高这一问题的,具体修改选项如下: performance_schem ...
- CLR Profile解决内存占用过高
CLR Profile解决内存占用过高的问题 炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样." 勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况 ...
- Firefox内存占用过高解决方法
刚开始使用firefox火狐浏览器的时候,你会发现firefox占用内存大,CPU占用率高,打开网页停顿等问题,其实这些是因为firefox没有进行优化,默认设置是标准的设置的原因,解决方法如下: 一 ...
- [转帖]Linux中buff/cache内存占用过高解决办法
Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...
- Spring cloud开发内存占用过高解决方法
https://blog.csdn.net/wanhuiguizong/article/details/79289986 版权声明:本文为博主原创文章,转载请声明文章来源和原文链接. https:// ...
- [2017-08-09]一则使用WinDbg工具调试iis进程调查内存占用过高的案例
最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2. 这台服务器上装了SqlServer.TFS(项 ...
- 【转】一则使用WinDbg工具调试iis进程调查内存占用过高的案例
最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2.这台服务器上装了SqlServer.TFS(项目 ...
- 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
摘要:该项目是DAYU平台的数据开发(DLF),数据开发中一个重要的功能就是ETL(数据清洗).ETL由源端到目的端,中间的业务逻辑一般由用户自己编写的SQL模板实现,velocity是其中涉及的一种 ...
- Linux 内存 占用较高问题排查
Linux 内存 占用较高问题排查 niuhao307523005 2019-04-24 14:31:55 11087 收藏 11展开一 查看内存情况#按 k 查看 free #按兆M查看 free ...
随机推荐
- 搭建mqtt服务器apollo
使用的apollo,官网太慢,附上百度云下载地址: 链接:https://pan.baidu.com/s/1NIq6R71hlyPuaUBwPoMPNg 提取码:36vw 原文链接:https://b ...
- Python实现双链表
双向链表(Double_linked_list)也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结 ...
- 小白的C++之路——结构体
结构体与数组不同的是结构体能包含不同类型的数据,像一个综合性的仓库,更加灵活. #include <iostream> #include <string> #include & ...
- Delphi阿里云短信【支持短信发送、短信批量发送和查询短信发送记录】
作者QQ:(648437169) 点击下载➨Delphi阿里云短信 阿里云api文档 [Delphi 阿里云短信]是最新的阿里云短信接口,不是阿里大于短信接口,支持SendSm ...
- Linux 线程间的同步与互斥
在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性. 线程同步: 条件变量 为什么使用条件变量? 对临界资源的时序可控性,条件满足会通知其他等待操作临界资源的线程, ...
- flink checkpoint状态储存三种方式选择
Flink 提供了三种可用的状态后端:MemoryStateBackend,FsStateBackend,和RocksDBStateBackend. MemoryStateBackend Memory ...
- 配置多用户SMB挂载
在 system1 通过 SMB 共享目录 /devops ,并满足下列要求: 1.共享名为 devops 2.共享目录 devops 只能 group8.example.com 域中的客户端使用 3 ...
- JVM与并发
1.jvm内存模型 硬件内存模型 处理器-->高速缓存-->缓存一致性协议-->主存 java内存模型 线程<-->工作内存<-->save和load < ...
- 21、Cursorを使う
例: (詳しい内容が後で追加) declare @tempTB table ( PEファンドコード ) ) --1.データ格納用の変数を声明 ) --2.Cursorを声明.内容を定義 declare ...
- 图像平移 cv.warpAffine()函数用法
# 图像平移image1='C:\\Users\\10107472\\Desktop\\myfile\\tensorflow-yolov\\read.jpg'img = cv.imread(image ...