0

这是我的代码的模型,而不是完整的代码......但足以提出以下问题:

当我创建一个 imagemagick 对象的克隆时,我是否还必须清除并销毁该对象或者只是第一个对象。换句话说,在我的模型代码中,我是否还需要在 foreach 循环内销毁$clone或仅在循环外销毁$im,或者两者都销毁???

谢谢

function create_clone($size, $filename, $filepath)
{
   $thumb = array();
   $dir = get_dir($filename); //validate directory to write clones

   if (isset($dir)) {
      $im = new imagick($filepath);

      //create sizes of same image
      foreach ($size as $value) {
         $clone = $im->clone();

         //create clone
      }

      $im->clear();
      $im->destroy();
   }

   return $thumb;
}
4

1 回答 1

0

Imagick::clear()Imagick::destroy()扭曲相同的ClearMagickWand方法,所以你只需要调用一个来释放分配的资源。您需要清除或销毁foreach循环中的每个克隆对象。这是因为克隆只会制作对象的精确副本。清除原始资源不会释放分配给另一个对象的相同资源。

$im = new imagick($filepath);

foreach ($size as $value) {
  $clone = $im->clone();

  // Do work

  $clone->clear();
}

$im->clear();

此外,您应该使用clone关键字,因为该方法已被弃用

<?php

  // Initialize image object
  $img = new Imagick($resource);

  // Exact copy of object + data resources
  $imgCopy = clone $img;

  // Compare resource of two objects
  var_dump($img->getImageBlob() === $imgCopy->getImageBlob());
  //=> bool(true)

  // Free original object
  $img->destroy();

  // Verify original object is empty
  var_dump($img->getImageBlob());
  //=> Warning: Uncaught exception 'ImagickException' with message 'Can not process empty Imagick object'

  // Verify copied object's resources are still allocated
  var_dump($imgCopy->getImageBlob());
  //=> string(342) "?PNG\r\n\032\n\000\000\000\rIHDR .... IEND?B`?"
于 2013-07-01T21:17:55.327 回答