Команда imagemagick convert не работает правильно в php-скрипте, но работает из командной строки

Системный вызов convert в php работал годами, но перестал работать в начале этого года. Все команды, которые я использую, работают правильно, если они выполняются из командной строки с помощью Putty.

Тестовый файл php, который я создал для отладки, это

<?  
$string = "convert  -verbose -resize 200x200  \"startline/main_menu.png\" \"image/temp222_main_menu.png\" ";
passthru($string);
?>

<IMG SRC='image/temp222_main_menu.png '  alt='main_menu'>

Выходной файл не создается. я получаю этот ответ

startline/main_menu.png PNG 600x1024 600x1024+0+0 8-bit DirectClass 92.1KB 0.020u 0:00.020

Если я заменю свою строку на это

$string = "convert  -version -resize 200x200  \"startline/main_menu.png\" \"image/temp222_main_menu.png\" ";

Выходной файл создается, но его размер не изменяется.

Я получаю этот ответ:

Version: ImageMagick 6.6.0-4 2012-04-26 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2010 ImageMagick Studio LLC Features: OpenMP

Интересно, что это работало с 2008 года до начала этого года. Возможно, это было, когда я перешел на PHP5 и новый сервер, не уверен. Это работает на 1and1.com

В техподдержке 1and1 сказали, что проблема в том, что аутфайла не существует, и закрыли дело. Это было не очень полезно.

Мне интересно, есть ли что-то, что мне нужно поместить в мой файл php.ini или что-то в этом роде.


Я также пробовал это: exec("/usr/bin/convert -resize 200x200 image/temp222_main_menu.png"); ?>

Просто заметка. Я ввел подробное описание, чтобы быть уверенным, что я действительно запускаю программу, что какой-то вывод возвращается. Это также показывает, что он загружает правильный файл. Именно поэтому я использовал passthru вместо exec или system. Это просто тестовый скрипт. Сценарий, который я использовал до того, как он сломался, не использовал passthru, но в нем было слишком много сообщений. Суть в том, что исполняемая строка не работает в php, но работает в командной строке, поэтому она правильная.


person Allen Edwards    schedule 21.08.2012    source источник
comment
В какой операционной системе работает ваш PHP?   -  person Kurt Pfeifle    schedule 21.08.2012
comment
PHP под линукс. Обратите внимание, что все эти скрипты работали в течение 4 лет. Что-то изменилось в системе.   -  person Allen Edwards    schedule 22.08.2012


Ответы (2)


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

Поместите эту строку в начало вашего PHP-скрипта, который вызывает imagemagick:

putenv("MAGICK_THREAD_LIMIT=1");
person Patrick    schedule 25.08.2012
comment
Забыл упомянуть... Я столкнулся с этим, используя виртуальный хостинг 1and1. - person Patrick; 25.08.2012
comment
Добро пожаловать :) Это сводило меня с ума на несколько дней, поэтому я решил поделиться ответом и избавить других от страданий. Если вы один из тех людей, которые не просто довольны его работой и хотят понять решение, вот ссылка на человека, который нашел решение и хорошее объяснение (см. комментарий № 6). http://drupal.org/node/1493574 - person Patrick; 27.08.2012

Вы должны попробовать эти шаги, чтобы отладить проблему.

Во-первых, проверьте, работает ли установка вообще, указав полные пути ко всем именам файлов и командам:

<?php  
exec("which convert");
?>

<?php  
exec("/path/to/convert  /path/to/a.png  -resize 200x200  /tmp/a200x200.png");
?>

(Очевидно, вам придется адаптировать пути к вашей ситуации.)

Затем проверьте, есть ли у учетной записи пользователя, под которой работает ваш PHP, права на запись в ваш целевой каталог:

<?php  
exec("pwd");
exec("touch $(pwd)/image/temp222_main_menu.png");
?>

Я бы изменил ваш код на это, чтобы он вообще работал:

<?php  
exec("/usr/bin/convert -resize 200x200  image/temp222_main_menu.png");
?>

<IMG SRC='image/temp222_main_menu.png'  alt='main_menu'>

Примечание...

  1. ... Я удалил часть -verbose (она создает только дополнительную строку в stderr startline/main_menu.png PNG 600x1024 600x1024+0+0 8-bit DirectClass 92.1KB 0.020u 0:00.020 и, вероятно, является причиной того, что команда convert никогда не завершает преобразование.

  2. ... Я не использовал вашу модификацию -version, потому что это не имеет смысла в вашем контексте (и это также приводит к пропуску части -resize).

  3. ...Я удалил пробел в строке <IMG SRC=.....

  4. ...Я переключился на exec(...)

Если вы настаиваете на добавлении шума в вывод stderr, попробуйте добавить параметр -monitor вместо параметра -verbose...

person Kurt Pfeifle    schedule 21.08.2012
comment
Спасибо за ответ, какой конвертер -› /use/bin/convert я могу писать в этом каталоге файлов и делаю это постоянно. Использование пути в файле convert exec ничего не меняет. - person Allen Edwards; 22.08.2012
comment
Смотрите редактирование моего поста. Я попробовал измененный код, хотя я добавил несколько кавычек, чтобы заставить его работать, но получил тот же результат. - person Allen Edwards; 22.08.2012
comment
‹? $string = convert -resize 200x200 \startline/main_menu.png\ \image/temp222_main_menu.png\ ; исполнить ($ строка); echo ‹hr›$string‹hr›; ?› ‹IMG SRC='image/temp222_main_menu.png ' alt='main_menu'› - person Allen Edwards; 22.08.2012
comment
Извините, это не то, что я рекомендовал! - person Kurt Pfeifle; 22.08.2012
comment
то, что вы рекомендовали, не работало, так как кавычки отсутствовали. Он сгенерировал сообщение об ошибке php, поэтому я исправил это. Если я возьму строковую переменную и введу строку непосредственно в команду exec, я получу тот же результат. Вот ошибка из того, что вы опубликовали: Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный '/', ожидание ')' в /homepages/46/d251035929/htdocs/l36/temp222.php в строке 2 - person Allen Edwards; 22.08.2012
comment
Суть моей рекомендации заключалась в том, чтобы протестировать сначала с абсолютным путем для вывода: /tmp/a200x200.png в каталог, который, скорее всего, будет доступен для записи для всех. Этот тест установит, может быть, это проблема с правами доступа... Но вы продолжали тестировать с относительными путями, о которых вы не знаете, куда они ведут... - person Kurt Pfeifle; 22.08.2012