2010-12-06 71 views
3

我有一个PHP脚本,用于在用户的FTP文件夹中调整图像大小以便在其网站上使用。Image magick/PHP正在摔倒大图像

虽然调整速度缓慢,但脚本已正确完成过去的所有图像。然而,最近,用户上传了一张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对象没有从内存中移除。

有没有什么方法可以优化我的脚本,以便更有效地使用更少的内存或垃圾回收?
难道我只是没有内存来应付这么大的图像吗?

干杯

+0

尽量只使用“转换”命令行工具,它应该更快和韩元不计入PHP的内存限制。 – robbrit 2010-12-06 14:11:48

回答

2

呼叫$image->setSize()$image->readImage()之前有libjpeg的调整图像大小,同时加载,以减少内存使用情况。

(编辑),示例用法:Efficient JPEG Image Resizing in PHP

+0

谢谢Steve-o,这证明可以大大帮助内存使用,并且我通过这样做完成了整个方法。但应该注意的是,对于我试图做的更大的桌面壁纸(1920x1200 +),它仍然在探测我。我想我必须对setSize()非常积极,让我的用户使用较小的图像,或者完全使用另一种方法。感谢您的建议! – jmillar 2010-12-06 16:02:53

3

进行更详细的说明,请参见this answer

imagick使用共享库,它的内存使用情况是遥不可及的PHP的,所以调整PHP内存和垃圾收集也无济于事。

尝试创建new Imagick()对象在此之前加入:

// 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交换到磁盘(默认为/ TMP)时,它需要多于32 MB为杂耍图像。它会变慢,但不会耗尽内存(除非/ tmp在虚拟盘上,在这种情况下,您需要更改imagick写入临时文件的位置)。

+1

这是旧的,但这个评论是正确的,也是错误的。值在BYTES中,而不是MB。 `$ magick-> setResourceLimit(\ imagick :: RESOURCETYPE_MEMORY,67108864); $ magick-> setResourceLimit(\ imagick :: RESOURCETYPE_MAP,67108864);`对于64 MB的限制;不要在imagick的新版本上使用静态调用 – Method 2016-03-31 22:49:03

2

MattBianco几乎是正确的,唯一的变化就是内存限制是字节,因此将是33554432为32MB:

// pixel cache max size 
IMagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 33554432); 
// maximum amount of memory map to allocate for the pixel cache 
IMagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 33554432); 
+0

您应该在较新版本的imagick中使用该调用的非静态变体; `$ img-> setResourceLimit(\ imagick :: RESOURCETYPE_MEMORY,33554432);` – Method 2016-03-31 22:52:46