首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP Imagick内存泄漏

PHP Imagick内存泄漏
EN

Stack Overflow用户
提问于 2012-04-03 20:17:30
回答 4查看 9.5K关注 0票数 9

我必须用Imagick在PHP CLI上渲染一些东西。我注意到每隔3-5天服务器内存就会满一次,所以我甚至无法通过ssh或ftp进行connet。

使用memory_get_usage(),我将内存泄漏向下讲述到脚本的imagick部分。该脚本如下所示:

代码语言:javascript
复制
$sourceImg = 'source.png';
$destImg = 'dest.png';
$background ='#00ff00';

$im = new Imagick();
$im->pingImage($sourceImg);
$im->readImage($sourceImg); 
$draw = new ImagickDraw();

for($i=1;$i<=5;$i++){
    $draw->setFillColor( $background);
    $draw->rectangle( 10*$i+5, 10, 10*$i+10, 20);
} 

$im->drawImage( $draw );
$im->writeImage( $destImg );
$im->destroy();

unset($im,$draw);

我销毁了图像引用,并取消了imagick和imagickDraw对象的设置,但脚本不会释放任何内存。setFillColor()方法占用的内存最多

我还能做些什么来释放imageick使用的空间吗?

image of the memory consumption

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-11 17:04:08

imagick使用一个共享库,PHP无法使用它的内存,因此调优PHP内存和垃圾收集没有任何帮助。

我自己也遇到了同样的问题,试图处理一个包含50 (!)的多页tiff图像。3000x2000像素的页面。解决方案是让imagick将其像素缓存放在磁盘上。

在创建Imagick对象之前添加此代码为我解决了这个问题:

代码语言:javascript
复制
// pixel cache max size
IMagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 256);
// maximum amount of memory map to allocate for the pixel cache
IMagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 256);

我们的目标是让imagick把它的像素缓存放在磁盘上,而不是RAM中。默认位置似乎是files /tmp/magick-XXnnnnn,因此请确保/tmp不在shmfs/ramdisk上,或者更改imagick使用的临时目录。

要调查的其他资源限制:imagick::RESOURCETYPE_DISKimagick::RESOURCETYPE_FILEimagick::RESOURCETYPE_AREA。它们在imagick::getResourceLimit() manual page中进行了描述(在setResourceLimit()的页面中不是很好)。

在我的图像处理循环中,我使用了set_time_limit(300),因为脚本需要很长时间才能处理这个巨大的(解压时)图像。

编辑:在最近的版本中,setResourceLimit()不应该作为静态方法调用,而是在实际对象上调用,例如:

代码语言:javascript
复制
$im->setResourceLimit(imagick::RESOURCETYPE_MEMORY, 256);
$im->setResourceLimit(imagick::RESOURCETYPE_MAP, 256);
$im->setResourceLimit(imagick::RESOURCETYPE_AREA, 1512);
$im->setResourceLimit(imagick::RESOURCETYPE_FILE, 768);
$im->setResourceLimit(imagick::RESOURCETYPE_DISK, -1);
票数 22
EN

Stack Overflow用户

发布于 2015-06-23 19:54:17

我知道这是旧的,但我遇到了同样的问题,并调用$im->clear()而不是$im->destroy()为我修复了内存泄漏。

根据documentation Imagick::destroy() has been deprecated in favor of Imagick::clear()的说法。所以应该使用clear()

票数 7
EN

Stack Overflow用户

发布于 2020-06-04 07:27:13

你可以用这个。

注意,根据文档,在释放内存使用方面,clear()destroy()更可取。

代码语言:javascript
复制
// clear temp files
$imagick_image->clear(); // in your case "$img->clear();"

您还可以运行cron为您删除临时文件,否则您的服务器可能会崩溃。这不是php代码,这是命令行代码。

代码语言:javascript
复制
# linux command
find /tmp/ -name "magick-*" -type f -delete

# cron
45 * * * * find /tmp/ -name "magick-*" -type f -delete
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9993085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档