当前位置: 首页 > 后端技术 > PHP

PHP处理高分辨率图片的问题_0

时间:2023-03-29 18:52:41 PHP

今天朋友在群里问了这样一个问题:出现这种情况是因为内存不足,PHP程序直接退出了。报错大致如下:上图的意思是我们最大可以使用的内存是8M,但是需要额外的41bytes来处理这张图片,这样会导致内存不足,这是一个严重的错误。在对图片进行操作之前,需要将图片的所有信息读入内存,另一部分内存会用来处理计算和缓存输出,所以内存大小的使用还是和图片的大小。PHP中图像的处理使用了GD库。这个库提供了很多方法让PHP更方便的对图片进行操作。支持的图片格式如下:回到最初的问题,小伙伴需要处理高分辨率的图片Pictures,图片的尺寸肯定很大,所以会出现内存不足的情况,解决办法还是有很多的.1.设置图片最大可上传尺寸。前端可以在上传前检查大小。如果超过最大值,则不会直接请求接口。同时为了安全起见,后端在收到请求后也会检查大小,防止程序异常退出。2.压缩图片3.关闭memory_limit群里的朋友最后用简单粗暴的方式解决了问题,直接在PHP中关闭memory_limit:set_time_limit(0);@ini_set('memory_limit','-1');这样虽然解决了问题,但是既不优雅也不安全。也可以通过在php.ini配置文件中将memory_limit的值设大来解决:memory_limit=256MPHP代码也可以这样设置:ini_set('memory_limit','256M');上面我们固定了memory_limit参数,这带来了一个缺点,因为在大多数情况下,不需要这么大的内存,有点浪费资源。最好的办法是根据需要设置memory_limit。我写了以下方法之一,可供参考:publicfunctionsetMemoryLimit($filename){//控制执行时间set_time_limit(50);$maxMemoryUsage=256M;$宽度=0;$高度=0;$size=ini_get('内存限制'??);//获取图像大小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);如果($size>$maxMemoryUsage){$size=$maxMemoryUsage;}//Updateini_set('memory_limit',$size.'M');}最后网上说GD库比较耗内存,我这里没有做测试。Github上有一个C项目叫libvips/libvips:它可以提高图像处理的速度而不占用大量内存。这个是地址:https://github.com/libvips/li...,有空可以学下。