资讯专栏INFORMATION COLUMN

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

thursday / 2602人阅读

摘要:中图片的处理都是使用了库,这个库提供了很多方法让可以更方便地对图片进行操作,支持的图片格式如下回到一开始的问题,那个小伙伴需要处理高分辨的图片,图片大小必然很大,所以就会出现内存不够的情况,解决方法还是有很多的。

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

出现这种情况就是因为内存不足,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/li...,有时间可以学习下。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31003.html

相关文章

  • python数字图像处理实现图像形变与缩放

      小编写这篇文章的主要目的,主要是给大家介绍关于Python的一些事宜,比如会涉及到图像处理相关的问题,比如会涉及到相关的图像的形变与缩放,那么,遇到这种问题的话,具体要怎么操作呢?下面就给大家详细解答下。  skimage的transform模块  图形的放大与缩小,应用到的技术是skimage的transform模块,函数比较多,功能齐全。  1、改变图片尺寸resize  函数格式为:  ...

    89542767 评论0 收藏0
  • 又拍云图片处理集群架构

    摘要:又拍云图片处理集群规模及架构图片处理集群规模台核内存的服务器,相当于有核的处理能力。平时花瓣网的图片处理量就已经占集群超过,一下子翻几十倍的处理量进来,肯定会对作图服务造成影响。 黄慧攀,又拍云 CTO。最早在 2001 年开始 web 开发工作;2006 年创办 yo2.cn 优博网(WordPress 博客平台);2010 年加入又拍云开始构建第一代云存储和云 CDN 服务。曾从事前端、...

    n7then 评论0 收藏0
  • php 上传图片造成内存溢出 Allowed memory size of ... bytes

    摘要:场景图片上传,是网站开发常见的需求用户上传图片后端处理图片压缩生成缩略图裁剪加水印等等保存在特定的文件夹中,在这个过程中,有时候上传大图片会出现错误,就是内存溢出的意思。 [场景]     图片上传,是网站开发常见的需求——用户上传图片=>后端处理图片(压缩、生成缩略图、裁剪、加水印等等...)=>保存在特定的文件夹中,在这个过程中,有时候上传大图片会出现错误Allowed memor...

    CarterLi 评论0 收藏0

发表评论

0条评论

thursday

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<