PHP处理高分辨率图片错误问题怎样处理呢
Admin 2022-09-17 群英技术资讯 293 次浏览
今天小伙伴在群里问了这么一个问题:
出现这种情况就是因为内存不足, PHP 程序直接退出了,报错大概如下:
上图的意思就是说,我们能使用的内存最大是8M,但是处理这个图片还需要额外的41bytes,就会导致内存不足,这是一个很严重的错误。在对图片进行操作前需要将图片的所有信息读入内存中,同时还会使用另一部分内存同于处理计算并缓存输出,所以内存大小的使用还是和图片的大小有关。
PHP 中图片的处理都是使用了 GD 库,这个库提供了很多方法让 PHP 可以更方便地对图片进行操作,支持的图片格式如下:
回到一开始的问题,那个小伙伴需要处理高分辨的图片,图片大小必然很大,所以就会出现内存不够的情况,解决方法还是有很多的。
前端上传前可以先检测下大小,如果超过最大值直接就不请求接口,同时为安全起见,后端接收到请求后也要检测大小,防止程序异常退出。
群里的小伙伴最后使用了一种 简单粗暴的方式 解决了该问题,直接在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,有时间可以学习下。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
原文链接:http://www.orlion.ga/731/php用clone复制对象有一个问题,下面用代码来说明问题:class Foo{public $bar;public $name;public function __construct(Bar $bar , $name){$this->bar = $bar;$this->name = $nam
在laravel中,服务容器是一个用于管理类依赖以及实现依赖注入的强有力工具。当应用程序需要使用某一个服务时,服务容器会将服务解析出来,并同时自动解决服务之间的依赖,然后交给应用程序使用。
这篇文章主要给大家介绍了关于PHP如何从txt文件中读取数据的相关资料,文中通过实例代码以及图文介绍的非常详细,对大家学习或者使用PHP具有一定的参考学习价值,需要的朋友可以参考下
本文实例讲述了laravel框架学习记录之表单操作。分享给大家供大家参考,具体如下:
在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获,不得跨协程捕获异常。不仅是应用层throw的Exception,底层的一些错误也是可以被捕获的,如function、class、method不存在。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008