ImageMagick thumbnailImage Превышено максимальное время выполнения 30 секунд - PullRequest
5 голосов
/ 07 декабря 2011

Я использую функцию ImageMagick thumbnailImage для создания изображений. Однако иногда я получаю сообщение:

«Превышено максимальное время выполнения 30 секунд»

Одна вещь, которую я заметил, это то, что все бомбы за 30 секунд подняты Но ошибка по-прежнему заключается в том, что максимальное время выполнения было превышено.

Проблема гораздо больше похожа на ссылку ниже. http://xenforo.com/community/threads/fatal-error-maximum-execution-time-exceeded-when-uploading-avatars.17982/

Кто-нибудь может дать какое-нибудь предложение?

Ответы [ 6 ]

7 голосов
/ 07 августа 2014

Я знаю, что этот вопрос старый, но у меня была та же проблема с максимальным временем выполнения 180 секунд (что совершенно неприемлемо). После долгих поисков я нашел источник проблемы и решение, и я хотел бы поделиться этим здесь для будущих пользователей, у которых есть эта проблема.

Проблема с тайм-аутом ImageMagick связана с ошибкой, связанной с расширением OpenMP. По сути, расширение OpenMP должно допускать параллельную обработку для ускорения процесса. Однако если на вашем сервере несколько процессоров или несколько процессорных ядер, параллельные процессы могут фактически блокировать выполнение друг друга и оставить все как есть.

Я обнаружил, что лучшим решением было отключить OpenMp и перекомпилировать пакет ImageMagick.

Вот страница, которая описывает то, что я только что сказал, но лучше (она включает ссылку на инструкции для проверки количества процессоров и процессорных ядер): http://www.daniloaz.com/en/617/systems/high-cpu-load-when-converting-images-with-imagemagick/

Вот инструкции о том, как отключить и перекомпилировать пакет: http://mapopa.blogspot.com/2011/10/php-image-slow-smp-magick-on-ubuntu.html ПРИМЕЧАНИЕ: первая строка кода содержит опечатку. Следует читать:

apt-get build-dep imagemagick
3 голосов
/ 20 декабря 2014

Могут быть проблемы с зависанием ImageMagick при включенном OpenMP, поэтому вы можете попробовать перестроить его с отключенным OpenMP - как указано Грегом.

Чтобы увидеть, включен ли Open MP, откройте окно терминала, введите

identify -version 

и найдите OpenMP в разделе «Возможности»

В качестве быстрого теста и возможного обходного пути, вы можете попробовать отключить многопоточность в ImageMgick, которая должна помешать OpenMP делать что-либо.

Для этого установите переменную среды ImageMagick MAGICK_THREAD_LIMIT в 1, прежде чем вызывать какие-либо функции IM.

putenv('MAGICK_THREAD_LIMIT=1');

Справочный материал: здесь .

1 голос
/ 21 декабря 2014

Я не эксперт в этом вопросе, но постараюсь лучше.

Проверьте ограничение памяти Увеличьте его минимум на 256 МБ.

Вы можете ограничить различные ресурсы с помощью времени => convert -limitвремя 1 in.jp2 out.jpg Установите этот флажок => http://www.imagemagick.org/script/command-line-options.php?ImageMagick=9jcfn0pu5vfu215d7r2df55ah1#limit

Если вы работаете с большими изображениями, вы можете просто проверить размер файла изображения и выйти, если он слишком большой.Также вы можете выполнить некоторую специальную обработку больших изображений, чтобы ускорить процесс, чтобы не трогать.Проверьте это => http://www.imagemagick.org/Usage/files/#massive

1 голос
/ 19 декабря 2014

Я бы предложил использовать функцию set_time_limit .

Если установить значение 0, сценарий будет выполняться без ограничения.

set_time_limit(0);

Это, изКонечно, это решит вашу проблему, но это не устранит того, что imagemagick не должен занимать так много времени, чтобы сделать миниатюру.

Я бы сначала проверил, заполнены ли все данные, переданные в imagemagick.Если что-то пусто, это может вызвать бесконечный цикл.Кроме того, я бы попытался определить, сколько времени на самом деле займет сценарий.

0 голосов
/ 30 июня 2017

Проблема в том, что если в вашем ImageMagick включен OpenMP, то ImageMagick использует несколько ядер ЦП, и если вы используете PHP-FPM, то он основан на многопоточности, но максимальное время_экспозиции, заданное вами в конфигурации php.ini, предназначено для один процессор.

В вашем терминале выполните: convert -list resource и посмотрите значение Thread. Это будет выше, чем 1.

Вы можете уменьшить количество потоков до 1, перейдя в ImageMagick policy.xml:

<policy domain="resource" name="thread" value="1"/>

Проверьте ограничение количества потоков еще раз: convert -list resource. Это должно быть 1.

Теперь перезапустите ваш PHP-FPM. Например: service php7.1-fpm restart и теперь вы увидите, что PHP использует точное max_execution_time, как вы установили.


Если вы не можете использовать терминал, вы также можете установить ограничение потока напрямую через PHP. Вы также можете установить ограничение потока непосредственно через PHP:

Imagick::setResourceLimit(Imagick::RESOURCETYPE_THREAD, 1);
echo Imagick::getResourceLimit(Imagick::RESOURCETYPE_THREAD);

Эта константа доступна, если Imagick был скомпилирован с ImageMagick версии 6.7.8 или выше.


Но так как мы сейчас используем однопоточный, производительность ImageMagick будет не такой хорошей, как раньше. Таким образом, вы можете увеличить значение потока в policy.xml и установить для max_execution_time значение: 30 * number_of_threads.

Другие решения были бы трудными, но достигают того же результата, что и мы выше.

  1. Перестройка ImageMagick с отключенным OpenMP.
  2. Использовать mod_php вместо PHP-FPM.
0 голосов
/ 07 декабря 2011

Попробуйте <?php set_time_limit(0); ?> вверху вашего PHP-файла.

...