我有一个 PHP 脚本,用于调整用户 FTP 文件夹中图像的大小,以便在他的网站上使用。
虽然调整大小的速度很慢,但该脚本已正确完成了过去的所有图像。然而最近,用户上传了 21 兆像素 JPEG 图像的相册,正如我发现的那样,该脚本无法转换图像,但没有给出任何 PHP 错误。当我查阅各种日志时,我发现多个 Apache 进程因内存不足错误而被终止。
PHP 脚本的功能部分本质上是一个 for 循环,它迭代磁盘上的图像并调用一个方法来检查缩略图是否存在,然后执行以下操作:
$image = new Imagick();
$image->readImage($target);
$image->thumbnailImage(1000, 0);
$image->writeImage(realpath($basedir)."/".rescale."/".$filename);
$image->clear();
$image->destroy();
服务器有 512MB RAM,通常至少有 360MB 以上可用空间。
PHP 目前的内存限制设置为 96MB,但我之前已将其设置得更高,但对问题没有任何影响。
根据我的估计,未压缩时 21 兆像素的图像应占据 80MB+ 的区域,因此我很困惑为什么 RAM 消失得如此之快,除非 Image Magick 对象没有从内存中删除。
有什么方法可以优化我的脚本以使用更少的内存或更有效地进行垃圾收集吗?
难道我根本就没有内存来处理这么大的图像吗?
Cheers
See 这个答案 https://stackoverflow.com/a/12835966/385571以获得更详细的解释。
imagick 使用共享库,它的内存使用超出了 PHP 的范围,因此调整 PHP 内存和垃圾收集不会有帮助。
尝试在创建之前添加此内容new Imagick()
object:
// pixel cache max size
IMagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 32);
// maximum amount of memory map to allocate for the pixel cache
IMagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 32);
当 imagick 需要超过 32 MB 来处理图像时,它会导致 imagick 交换到磁盘(默认为 /tmp)。它会更慢,但不会耗尽 RAM(除非 /tmp 在 ramdisk 上,在这种情况下,您需要更改 imagick 写入临时文件的位置)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)