我是否必须永远销毁()Imagick对象?

Cho*_*per 5 php imagemagick imagick

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?
Run Code Online (Sandbox Code Playgroud)

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

如果没有,这既烦人又可怕.

Cod*_*key 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 />';
Run Code Online (Sandbox Code Playgroud)

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

ab -n 20 -c 5 http://ubunty.local/sandbox/stackexchange/imagick.php
Run Code Online (Sandbox Code Playgroud)

里面似乎并没有太多东西。

我期望 destroy 使用更少的内存。即使在不同的变量中使用 image2 似乎也没有什么区别

$img2 = new Imagick('./image2.jpg');
Run Code Online (Sandbox Code Playgroud)

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