前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP处理高分辨率图片的问题

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

作者头像
猿哥
发布2019-03-19 14:24:48
1.1K0
发布2019-03-19 14:24:48
举报
文章被收录于专栏:Web技术布道师Web技术布道师

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

出现这种情况就是因为内存不足, PHP 程序直接退出了,报错大概如下:

上图的意思就是说,我们能使用的内存最大是8M,但是处理这个图片还需要额外的41bytes,就会导致内存不足,这是一个很严重的错误。在对图片进行操作前需要将图片的所有信息读入内存中,同时还会使用另一部分内存同于处理计算并缓存输出,所以内存大小的使用还是和图片的大小有关。

PHP 中图片的处理都是使用了 GD 库,这个库提供了很多方法让 PHP 可以更方便地对图片进行操作,支持的图片格式如下:

回到一开始的问题,那个小伙伴需要处理高分辨的图片,图片大小必然很大,所以就会出现内存不够的情况,解决方法还是有很多的。

1. 设置图片最大可上传的大小

前端上传前可以先检测下大小,如果超过最大值直接就不请求接口,同时为安全起见,后端接收到请求后也要检测大小,防止程序异常退出。

2. 压缩图片

3. 关闭 memory_limit

群里的小伙伴最后使用了一种 简单粗暴的方式 解决了该问题,直接在PHP中关闭 memory_limit

代码语言:javascript
复制
set_time_limit(0);
@ini_set('memory_limit','-1');

这样虽然解决了问题,但不优雅也不安全,同样在 php.ini 配置文件中将 memory_limit 的值设置很大也能解决:

代码语言:javascript
复制
memory_limit = 256M

PHP代码中也可以这样设置:

代码语言:javascript
复制
ini_set('memory_limit', '256M');

上面我们将 memory_limit 参数固定了,这就带来一个弊端,因为大多数情况下不需要这么大的内存,有点浪费资源,最好的做法就是根据需要来设置 memory_limit ,我写了一个如下方法可供参考:

代码语言:javascript
复制
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,有时间可以学习下。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 设置图片最大可上传的大小
  • 2. 压缩图片
  • 3. 关闭 memory_limit
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档