page contents

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

可以在不占用很多内存的情况下提高图片处理的速度,这是地址:https://github.com/libvips/libvips,有时间可以学习下。

attachments-2020-06-rlZ3lzoR5eeaca04b11e4.png

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

v2-c8c5c85a90fbc0926f824720d0ae6ec3_720w.jpg


v2-09268d40f82b099ee97f5e34645990de_720w.jpg


v2-23e155ffaef71293ec14a87eda287577_720w.jpg


v2-fcf30da625b5ba9e10ee83d10d30763d_720w.jpg

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

v2-59625dfd9294185cf738916dba13862a_720w.jpg

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

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

v2-77af30e57ae6f4582f07974865686ecb_720w.jpg

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


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 :

v2-3bf8685b8b4e11eae840784f84b5e09d_720w.jpg


v2-75c07f4b60e490e8c2a2ca6977e6ae42_720w.jpg

可以在不占用很多内存的情况下提高图片处理的速度,这是地址:https://github.com/libvips/libvips,有时间可以学习下。


attachments-2020-06-p6b9Ofy25eeac9561b60c.jpg

  • 发表于 2020-06-18 09:57
  • 阅读 ( 468 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章