2010-01-22 46 views
2

使用ImageMagick時,我可以設置內存使用量和最大線程數的某些限制。有3種方法可以做到這一點,據我所知:IMagick(PHP)中的線程數限制

  1. 使用命令行選項,如「轉換-limit 128MB內存original.jpg new.jpg」
  2. 使用環境變量,如「MAGICK_THREAD_LIMIT = 1 「
  3. 編輯'policy.xml'配置文件以更改默認值。

我已經使用「convert -list resource」測試了這些方法中的每一個,它們都可以工作。

現在,我需要在PHP中使用IMagick擴展。還有一個功能,我可以用它來設置限制:

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

對於第一個參數,我可以使用下列之一:

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 

的問題是,有沒有類似MAGICK_THREAD_LIMIT和IMagick似乎簡單地忽略配置文件和環境變量。我怎麼知道這個?我已將所有內存限制設置爲零,並且IMagick在報告內存不足時仍能正常運行。

我真的很希望我已經說清楚了。 問題是:如何在使用IMagick時更改線程限制?

編輯: 我設法將線程限制設置爲1通過編譯ImageMagick與'--without-threads'選項。 :P它將不得不做,直到我找到一個更好的解決方案。

+0

你嘗試使用一個小的,非零值的內存限制,以及? (例如。,1)似乎沒有關於setResourceLimit方法的任何文檔,它可以使用0作爲無限制,或者0可以被忽略,並且當imagemagick被調用時使用默認值。 – gapple 2010-01-23 01:27:00

+0

如果我使用$ image-> setResourceLimit將限制設置爲零,IMagick會給我提供關於內存不足的錯誤。我很確定這會禁用它們,例如,您可以禁用磁盤內存。 – liviucmg 2010-01-23 07:10:05

+0

據我所知,設置內存資源限制只是使用了多少內存 - 如果需要更多內存,它將使用其自己的基於磁盤的交換文件。 – scotts 2010-12-10 21:57:01

回答

1

在PHP IMagick擴展中沒有爲線程限制定義相應的常量,但查看整數值應該是6的源代碼,以便您可以嘗試此操作(請參閱magick/resource_.h中的ResourceType,所需值爲ThreadResource)。我正在使用MagickWand for PHP,並且遇到了同樣的問題 - 解決方法是啓用此常量並重新編譯。如果你有興趣在修補MagickWand爲PHP 1.0.8修復是:

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

謝謝!現在我正在使用ImageMagick編譯'--without-threads'標誌,它也做了這個。我不知道爲什麼,但如果編譯爲使用線程,ImageMagick在我的VPS上運行速度會降低2-3倍。 – liviucmg 2010-07-14 07:40:23

5

這幫助:

Imagick::setResourceLimit (6, 1); 
1

在ImageMagick的版本6.8.7-4,setResourceLimit(6,1)沒有幫助,也不 MAGICK_THREAD_LIMIT = 1。

但此設置的伎倆:

OMP_THREAD_LIMIT=1 

在CLI:

env OMP_THREAD_LIMIT=1 php ./myscript.php