Php 我必须总是销毁()Imagick对象吗?

Php 我必须总是销毁()Imagick对象吗?,php,imagemagick,imagick,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? 如果我覆盖引用,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?
如果我覆盖引用,Imagick是否会释放资源


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

我做了一个快速而肮脏的测试,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 />';
里面似乎没有多少东西

我原以为会用更少的内存。即使在不同的变量中使用image2似乎也没有什么不同

$img2 = new Imagick('./image2.jpg');
如果使用->destroy()是有原因的,那么就我所见,这一定是因为我忘记测量了

是。

请注意,根据文档,
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

我可以想象,当所有引用都丢失时,它会被标记为垃圾收集。@是的,但为什么这些方法会存在呢?为什么不像PDO一样使用“$img=null”释放资源呢?我在想也许Imagick会把这些资源保存在内存中,以防你再次使用它们。它缺少文档。我想如果你想创建一个图像,输出它,然后开始创建另一个图像(不使用新操作符),所有这些都是同一个对象。它将使用更少的内存,因为您不必等待垃圾回收。
$img=null
如果还有对图像对象的其他引用,则不会释放资源。使用
destroy
可以强制销毁。这可能是因为-注意:“.destroy()”已被弃用,取而代之的是“.clear()”。我没有改变最初的答案,因为它也与资源使用有关,而且我没有复制测试。
# linux command
find /tmp/ -name "magick-*" -type f -delete

# cron
45 * * * * find /tmp/ -name "magick-*" -type f -delete