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会释放资源吗?
如果没有,这既烦人又可怕。
答案 0 :(得分: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');
如果有理由使用 - &gt; destroy()那么它必须归结为我忘记测量的东西,据我所见。
答案 1 :(得分:2)
是的
请注意,根据文档,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