2010-01-22 8 views
2

Lorsque vous utilisez ImageMagick, je peux définir certaines limites pour l'utilisation de la mémoire et le nombre maximum de threads. Il y a 3 façons de le faire, pour autant que je sache:Limiter le nombre de threads dans IMagick (PHP)

  1. utiliser une option de ligne de commande comme « convertir 128Mo mémoire -Limiter original.jpg new.jpg »
  2. utilisation des variables d'environnement comme « MAGICK_THREAD_LIMIT = 1 "
  3. modifiez le fichier de configuration 'policy.xml' pour modifier la valeur par défaut.

J'ai testé chacune de ces méthodes en utilisant "convert -list resource" et elles fonctionnent.

Maintenant, j'ai besoin d'utiliser l'extension IMagick en PHP. Il y a une fonction que je peux utiliser pour fixer des limites:

bool Imagick::setResourceLimit (int $type, int $limit) 

Pour le premier paramètre que je peux utiliser une des opérations suivantes:

imagick::RESOURCETYPE_AREA (integer) //equivalent of MAGICK_AREA_LIMIT 
imagick::RESOURCETYPE_DISK (integer) //equivalent of MAGICK_DISK_LIMIT 
imagick::RESOURCETYPE_FILE (integer) //equivalent of MAGICK_FILE_LIMIT 
imagick::RESOURCETYPE_MAP (integer) //equivalent of MAGICK_MAP_LIMIT 
imagick::RESOURCETYPE_MEMORY (integer) //equivalent of MAGICK_MEMORY_LIMIT 

Le problème est qu'il n'y a pas d'équivalent semble MAGICK_THREAD_LIMIT et imagick ignorer simplement les fichiers de configuration et les variables d'environnement. Comment je le sais? J'ai mis toutes les limites de la mémoire à zéro et IMagick fonctionne toujours sans aucun problème quand il devrait signaler une mémoire insuffisante. J'espère sincèrement que je me suis clairement fait comprendre. La question est: comment puis-je changer la limite de fil lors de l'utilisation d'IMagick?

EDIT: J'ai réussi à définir la limite de fil à 1 en compilant ImageMagick avec l'option '--without-threads'. : P Il faudra faire jusqu'à ce que je trouve une meilleure solution.

+0

Avez-vous essayé à l'aide d'une petite valeur non nulle pour les limites de la mémoire ainsi? (par exemple., 1) Il ne semble pas y avoir de documentation sur la méthode setResourceLimit et il peut utiliser 0 comme illimité, ou 0 peut être ignoré et un défaut utilisé lorsque imagemagick est invoqué. – gapple

+0

Si je définis les limites en utilisant $ image-> setResourceLimit à zéro, IMagick me donne des erreurs sur l'insuffisance de mémoire. Je suis assez sûr que cela les désactive parce que, par exemple, vous pouvez désactiver la mémoire du disque. – liviucmg

+0

Je comprends que le réglage de la limite de ressources mémoire est simplement la quantité de RAM utilisée - s'il en faut plus, il utilisera son propre fichier d'échange sur disque pour le reste. – scotts

Répondre

1

Il n'y a pas de constante correspondante définie pour la limite de thread dans l'extension PHP IMagick, mais en regardant la source, la valeur entière devrait être 6 afin que vous puissiez essayer cela (voir ResourceType dans magick/resource_.h, la valeur requise est ThreadResource). J'utilise MagickWand pour PHP et j'ai eu le même problème - le correctif était d'activer cette constante et de la recompiler. Si vous êtes intéressé à raccommoder MagickWand pour PHP 1.0.8 le correctif est:

magickwand_inc.h 
-#define PRV_IS_ResourceType(x) (x == AreaResource || x == DiskResource || x == FileResource || x == MapResource || x == MemoryResource) /* || x == UndefinedResource */ 
+#define PRV_IS_ResourceType(x) (x == AreaResource || x == DiskResource || x == FileResource || x == MapResource || x == MemoryResource || x == ThreadResource) /* || x == UndefinedResource */ 

magickwand.c 
    MW_REGISTER_LONG_CONSTANT(MemoryResource); 
+ MW_REGISTER_LONG_CONSTANT(ThreadResource); 
+0

Merci! En ce moment j'utilise ImageMagick compilé avec le drapeau '--without-threads' et il a également fait l'affaire. Je ne sais pas pourquoi mais ImageMagick tourne 2-3 fois plus lentement sur mon VPS s'il est compilé pour utiliser des threads. – liviucmg

5

Cela a permis:

Imagick::setResourceLimit (6, 1); 
1

Dans la version 6.8.7-4 ImageMagick, setResourceLimit (6,1) ne permet pas, ni MAGICK_THREAD_LIMIT = 1.

Mais ce paramètre le tour est joué:

OMP_THREAD_LIMIT=1 

En CLI:

env OMP_THREAD_LIMIT=1 php ./myscript.php