今天小伙伴在群里问了这么一个问题:

出现这种情况就是因为内存不足,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处理高分辨率图片的问题的更多相关文章

  1. 近期Responsive web design项目经验分享-高分辨率图片处理篇

    在高分辨率的情况下  商品的图片难免会失真 怎样才能让商品的图片在高分辨率的情况下 效果不失真 提供用户更好的体验呢 我发现了一个解决方案 不知道是不是你想要的 先上图片对比下效果 左侧是使用后   ...

  2. ppt 制作海报 导出高分辨率图片

    用ppt做海报,导出图片的时候,发现导出的图片的分辨率只有96ppi,清晰度不太好. 怎么能这样呢! 网上搜了一下,发现微软提供了一个修改注册表的方法,点击这里访问.不过那里讲的最新只有2010,我的 ...

  3. WPF中加载高分辨率图片性能优化

    在最近的项目中,遇到一个关于WPF中同时加载多张图片时,内存占用非常高的问题. 问题背景: 在一个ListView中同时加载多张图片,注意:我们需要加载的图片分辨率非常高. 代码: XAML: < ...

  4. Windows phone应用开发[21]-图片性能优化

    在windows phone 中常在列表中会常包含比较丰富文字和图片混排数据信息. 针对列表数据中除了谈到listbox等控件自身数据虚拟化问题外.虽然wp硬件设备随着SDK 8.0 发布得到应用可使 ...

  5. 62.Android之各分辨率定义的图片规格

    转载:http://www.nljb.net/default/Android%E4%B9%8B%E5%90%84%E5%88%86%E8%BE%A8%E7%8E%87%E5%AE%9A%E4%B9%8 ...

  6. IOS开发中@2x图片等适应不同分辨率手机

    开发中,例如: nanshanImage.image=[UIImage imageNamed:@'index_pic.png']; 在项目中还保存中index_pic@2x.png的图片,此图为了只适 ...

  7. Android中图片处理相关问题

    在Android的开发中,我们经常回去处理一些图片相关的问题,比如当加载图片到内存中产生的OOM(OutOfMemory)异常.图片加载到内存中占多大内存的问题.jpg png两种常见的图片的原理及区 ...

  8. Android实战简易教程-第九枪(BitmapFactory.Options对资源图片进行缩放)

    我们知道,我们编写的应用程序都是有一定内存限制的.程序占用了过高的内存就easy出现OOM(OutOfMemory)异常.因此在展示高分辨率图片的时候,最好先将图片进行压缩,压缩后的图片大小应该和用来 ...

  9. Android大图片导致内存问题小结

    在网上看了部分Android中OOM的问题,现在根据理解,做一下笔记. Android OOM 产生的几种原因 1. 程序中使用了太多自己创建的Bitmap. 这种情况通常是最好解决的. 因为你明白你 ...

随机推荐

  1. Oralce 序列

    序列: 是oacle提供的用于产生一系列唯一数字的数据库对象. l  自动提供唯一的数值 l  共享对象 l  主要用于提供主键值 l  将序列值装入内存可以提高访问效率 创建序列: 1.  要有创建 ...

  2. CentOS安装和部署SVN服务器

    1.安装SVN 通过yum安装svn [root@localhost webber]# yum install subversion 查看svn是否安装成功 [root@localhost webbe ...

  3. [Codeup 25481] swan

    莫名其妙还找到了另一个铟炔锶烃的OJ : Codeup墓地 25481: swan 时间限制: 1 Sec  内存限制: 128 MB献花: 86  解决: 13[献花][花圈][TK题库] 题目描述 ...

  4. Chapter 3 Top 10 List

    3.1 Introduction Given a set of (key-as-string, value-as-integer) pairs, then finding a Top-N ( wher ...

  5. Alpha 冲刺报告(1/10)

    Alpha 冲刺报告 队名:洛基小队 峻雄(组长) 已完成:α版要完成的第一部分的游戏内容规划 明日计划:学习脚本教程,熟悉一下相关API 剩余任务:物品背包交互脚本 困难:对于JS脚本的不熟悉:如何 ...

  6. Windows和Linux环境,网络异常模拟测试方法【转载自光荣之路微信公众号】

    1.网络异常的分类 在系统的运行过程中,可能会遇到各种各样的网络问题,其中主要可能出现的问题有 网络延迟:当网络信息流过大时,可能导致设备反应缓慢,造成数据传输延迟: 网路掉包:网路掉包是在数据传输的 ...

  7. mysql-存储过程(转载)

    本来想自己写存储过程的,但是看到别人写的很全面,就直接转载过来了. 转自(http://www.cnblogs.com/exmyth/p/3303470.html) 14.1.1 创建存储过程 MyS ...

  8. windows server 2008/2012安装PostgreSQL过程及问题总结

    今天第一次接触在Windows Server2008/2012 下安装PostgreSQL,遇到的问题总结如下: 1.首先,在安装的时候,我更改安装目录改为自定义的E盘,安装时报错:libintl.d ...

  9. c++ 基类,派生类的类型兼容性

    #include <iostream> using namespace std; class CFather { public: void display() const { cout&l ...

  10. 【[TJOI2010]电影迷】

    一度自闭 这道题一看就是最小割无疑 我们假设源点\(S\)表示看这个电影,汇点\(T\)表示不看这部电影 如果一个电影的价值为正,我们就从源点点连一条容量为\(val\)的边,表示割掉这个边也就是选择 ...