Магия изображений:конвертировать png не удается с помощью PHP и работает через оболочку bash
-
06-07-2019 - |
Вопрос
У меня очень странная ошибка, решение которой мне еще предстоит найти. Обновить смотрите решение ниже
То, что я пытаюсь сделать, это преобразовать полноразмерное изображение в миниатюру размером 160х120.Он отлично работает с файлами jpg любого размера, но не с png.
Команда ImageMagick ( Магия изображений ):
/opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'
Функция PHP (сокращенная)
...
$cmd = "/opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'";
exec($cmd, $output, $retval);
$errors += $retval;
if ($errors > 0) {
die(print_r($output));
}
Когда эта функция выполняется, значение $retval равно 1, что означает, что команда преобразования выполнена с ошибкой (эскиз не создан).
Вот тут-то и становится интересно: если я выполняю точно такую же команду в своей командной оболочке, это работает.
wedbook:~ wedix$ /opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'
wedbook:~ wedix$
Я пробовал использовать другие функции PHP, такие как system, passthru, но это не сработало.Я подумал, может быть, кто-то здесь знает решение.
Я использую
MAMP 1.7.2
Apache/2.0.59
PHP/5.2.6
Спасибо!
Обновить
Я обновил следующие зависимости
libpng from 1.2.35 to 1.2.37
libiconv from 1.12_2 to 1.13_0
ImageMagick 6.5.2-4_1 to 6.5.2-9_0
Однако это не решило мою проблему.
2 - е ОБНОВЛЕНИЕ
Наконец-то я нашел кое-что, что могло бы помочь, когда функция запускается, это то, что печатается в журналах Apache:
dyld: Library not loaded: /opt/local/lib/libiconv.2.dylib
Referenced from: /opt/local/bin/convert
Reason: Incompatible library version: convert requires version 8.0.0 or later, but libiconv.2.dylib provides version 7.0.0
3- е ОБНОВЛЕНИЕ
libiconv.2.dylib имеет версию 8.0.0...
bash-3.2$ otool -L /opt/local/lib/libiconv.2.dylib
/opt/local/lib/libiconv.2.dylib:
/opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.0.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
4 - е ОБНОВЛЕНИЕ
Проблема была связана с MAMP, смотрите решение ниже
Решение
Решил это!
Получается переменная окружения DYLD_LIBRARY_PATH
не был настроен должным образом.
Mac OS X Leopard поставляется с libiconv 7.0.0, но для конвертации требуется версия 8.0.0 (см. 2-е ОБНОВЛЕНИЕ выше).
bash-3.2$ otool -L /usr/lib/libiconv.2.dylib
/usr/lib/libiconv.2.dylib:
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.1)
ImageMagick и все зависимости были установлены с MacPorts в /opt/local
.Для этого необходимо вручную добавить путь /opt/local/lib к DYLD_LIBRARY_PATH
.
Если я добавлю путь /opt/local/lib
Для DYLD_LIBRARY_PATH
в Mac OS X Leopard apachectl
файл envvars /usr/sbin/envvars
это не работает.Почему?Это потому, что я не использую apache из Mac OS X Leopard, я использую MAMP.
МАМП имеет свой собственный скрипт apachectl и это собственный файл envvars.
Я добавил путь /opt/local/lib
Для DYLD_LIBRARY_PATH
в МАМПЕ apachectl
файл envvars /Applications/MAMP/Library/bin/envvars
DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
Теперь мои миниатюры в формате PNG генерируются, и в журнале ошибок apache ошибок не генерируется!
Я надеюсь, что это кому-нибудь поможет, и в следующий раз я не забуду проверить все файлы журналов, прежде чем обращаться за помощью!
Фил
Другие советы
Моим путем был /opt/local/bin , но даже добавление этого в DYLD_LIBRARY_PATH не сработало.Наконец, когда я изменил простой ole-ПУТЬ, он заработал через PHP.
; Не сработало...
;DYLD_LIBRARY_PATH="/opt/local/bin:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH";
;экспортировать DYLD_LIBRARY_PATH
;Это работает!
путь экспорта="$PATH:/opt/local/bin"
Убедитесь, что пользователь, выполняющий php-код, имеет те же права доступа к файлам и каталогам.
Это должно быть очевидно, но убедитесь, что вы проверили такие вещи, как безопасный режим PHP, open_basedir и является ли exec
был отключен.