gpt4 book ai didi

PHP Imagick 内存泄漏

转载 作者:可可西里 更新时间:2023-10-31 23:03:37 27 4
gpt4 key购买 nike

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

我使用 memory_get_usage() 将内存泄漏归结为脚本的 imagick 部分。脚本看起来像这样:

$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

最佳答案

imagick 使用共享库,它的内存使用量超出 PHP 的范围,因此调整 PHP 内存和垃圾收集无济于事。

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

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

// 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 中。默认位置似乎是文件/tmp/magick-XXnnnnn,因此请确保/tmp 不在 shmfs/ramdisk 上,或者更改 imagick 使用的临时目录。

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

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


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

$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);

关于PHP Imagick 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993085/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com