我是否必须始终销毁()Imagick对象?

问题描述 投票:5回答:2

Imagick中有两种方法:clear()和destroy()。

但是我不确定何时使用它们。

例如,即使覆盖了我唯一的引用,我是否也必须销毁()?

$img = new Imagick($path1);
// do something with $img, then load a different image
$img = new Imagick($path2); // should I have destroyed $img before doing this?

如果我覆盖引用,Imagick会释放资源吗?

如果没有,这既令人讨厌又令人恐惧。

php imagemagick imagick
2个回答
4
投票

我进行了快速而肮脏的测试,image1为85kb image2为457kb

$start = microtime();

for($i=0; $i<10; $i++){
    $img = new Imagick('./image1.jpg');
    $img->setImageResolution(72,72);
    $img->resampleImage(72,72,imagick::FILTER_UNDEFINED,0);
    $img->destroy();

    $img = new Imagick('./image2.jpg');
    $img->setImageResolution(72,72);
    $img->resampleImage(72,72,imagick::FILTER_UNDEFINED,0);
    $img->destroy();
}

$end = microtime();
$len = $end - $start;
echo number_format($len, 2),'<br /> <br />';

function kb($n){
    return ceil($n/1024);
}

echo 'memory usage - ',kb(memory_get_usage()),' / ',kb(memory_get_peak_usage()),' <br />';

然后我注释掉破坏线,然后再次运行。奇怪的是,当使用destroy()时似乎使用了更多的内存,但是只有3或4 k。计时器显示的差异不大,当我运行基本的Apache基准负载测试时

ab -n 20 -c 5 http://ubunty.local/sandbox/stackexchange/imagick.php

似乎没有太多。

我原以为销毁将使用更少的内存。甚至在不同的变量中使用image2似乎也无济于事

$img2 = new Imagick('./image2.jpg');

如果有理由使用-> destroy(),那么据我所知,一定要归结为我忘记测量的东西。


0
投票

请注意,根据文档,clear()destroy()更可取。

// clear temp files
$imagick_image->clear(); // in your case "$img->clear();"

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

# linux command
find /tmp/ -name "magick-*" -type f -delete

# cron
45 * * * * find /tmp/ -name "magick-*" -type f -delete
© www.soinside.com 2019 - 2024. All rights reserved.