PHP处理高分辨率图片的问题
2020-06-18 00:00
113 查看
出现这种情况就是因为内存不足, PHP 程序直接退出了,报错大概如下:
上图的意思就是说,我们能使用的内存最大是8M,但是处理这个图片还需要额外的41bytes,就会导致内存不足,这是一个很严重的错误。在对图片进行操作前需要将图片的所有信息读入内存中,同时还会使用另一部分内存同于处理计算并缓存输出,所以内存大小的使用还是和图片的大小有关。
PHP 中图片的处理都是使用了 GD 库,这个库提供了很多方法让 PHP 可以更方便地对图片进行操作,支持的图片格式如下:
回到一开始的问题,那个小伙伴需要处理高分辨的图片,图片大小必然很大,所以就会出现内存不够的情况,解决方法还是有很多的。
1. 设置图片最大可上传的大小
前端上传前可以先检测下大小,如果超过最大值直接就不请求接口,同时为安全起见,后端接收到请求后也要检测大小,防止程序异常退出。
2. 压缩图片
3. 关闭 memory_limit
群里的小伙伴最后使用了一种 简单粗暴的方式 解决了该问题,直接在PHP中关闭 memory_limit :
set_time_limit(0);@ini_set('memory_limit','-1');
这样虽然解决了问题,但不优雅也不安全,同样在 php.ini 配置文件中将 memory_limit 的值设置很大也能解决:
memory_limit = 256M
PHP代码中也可以这样设置:
ini_set('memory_limit', '256M');
上面我们将 memory_limit 参数固定了,这就带来一个弊端,因为大多数情况下不需要这么大的内存,有点浪费资源,最好的做法就是根据需要来设置 memory_limit ,我写了一个如下方法可供参考:
public function setMemoryLimit($filename){// 控制执行时间set_time_limit(50);$maxMemoryUsage = 256M;$width = 0;$height = 0;$size = ini_get('memory_limit');// 获取图片大小list($width, $height) = getimagesize($filename);// 计算需要的内存,并转换成'M'单位// 4 因为png图片一个像素有4字节// 1.5 是一个调整因子,因为memory_limit不是那么精确// 详细可以查看: http://php.net/imagecreatefromjpeg#76968$size = $size + floor(($width * $height * 4 * 1.5 + 1048576) / 1048576);if ($size > $maxMemoryUsage){$size = $maxMemoryUsage;}// 更新ini_set('memory_limit',$size.'M');}
最后说一下,网上说 GD 库是比较耗内存的,但我这里没有做过测试。Github上有个 C 的项目叫 libvips/libvips :
可以在不占用很多内存的情况下提高图片处理的速度,这是地址:https://github.com/libvips/libvips,有时间可以学习下。
相关文章推荐
- php 压缩各格式图片,处理png格式图片背景黑色问题
- php中使用GD处理图片时,php文件为UTF-8编码时不能正常运行的问题
- php绘图图片失真问题处理
- php 处理透明背景的图片时的问题
- PHP上传图片和视频 问题处理(初学者)
- PHP图片处理中的汉字处理问题
- php 处理透明背景的图片时的问题
- jquery异步ajax超大长度base64图片长字段数据传输问题解决办法和php后台处理办法
- 产品生成器模块的问题---图片处理
- php 图片处理方法 缩略和剪切
- CodeIgniter中PNG图片处理背景不透明问题的解决办法
- php处理json时中文问题的解决方法
- WPF杂难解 RichTextBox粘贴图片地址处理,并保存的问题
- 一上传带图片的新闻.提交后就是个白屏 php 168 白屏问题?
- 用php处理图片水印(文字水印和图片水印)
- ASPJPEG图片处理组件安装和使用问题
- php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
- 让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
- PHP的array_diff()函数在处理大数组时的效率问题
- 图片加到json中,提交到服务器端处理异常问题。