Ограничить количество потоков в IMagick (PHP) - PullRequest
2 голосов
/ 23 января 2010

При использовании ImageMagick я могу установить определенные ограничения на использование памяти и максимальное количество потоков. Насколько я знаю, есть 3 способа сделать это:

  1. использовать параметры командной строки, такие как "convert -limit memory 128mb original.jpg new.jpg"
  2. использовать переменные окружения, такие как "MAGICK_THREAD_LIMIT = 1"
  3. отредактируйте файл конфигурации 'policy.xml', чтобы изменить значение по умолчанию.

Я проверил каждый из этих методов, используя "ресурс-списка конвертирования", и они работают.

Теперь мне нужно использовать расширение IMagick в PHP. Есть функция, которую я могу использовать для установки ограничений:

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?

EDIT: Мне удалось установить ограничение потока до 1, скомпилировав ImageMagick с опцией --without-threads. : P Это придется делать, пока я не найду лучшего решения.

Ответы [ 4 ]

5 голосов
/ 06 февраля 2013

Это помогло:

Imagick::setResourceLimit (6, 1);
2 голосов
/ 13 марта 2012

Можно передать переменную среды MAGICK_THREAD_LIMIT интерпретатору PHP, чтобы вам не нужно было касаться кода ImageMagick.

Проверьте это: Высокая загрузка процессора при преобразовании изображений с помощью ImageMagick

1 голос
/ 16 января 2014

В 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
1 голос
/ 13 июля 2010

Нет соответствующей константы, определенной для ограничения потока в расширении PHP IMagick, но, глядя на источник, целочисленное значение должно быть 6, чтобы вы могли попробовать это (см. ResourceType в magick / resource_.h, требуемое значение - ThreadResource ). Я использую MagickWand для 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...