Магия изображений:конвертировать png не удается с помощью PHP и работает через оболочку bash

StackOverflow https://stackoverflow.com/questions/1019768

  •  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, но это не сработало.Я подумал, может быть, кто-то здесь знает решение.

Я использую

  1. MAMP 1.7.2
    • Apache/2.0.59
    • PHP/5.2.6

Спасибо!

Обновить

Я обновил следующие зависимости

  1. libpng from 1.2.35 to 1.2.37
  2. libiconv from 1.12_2 to 1.13_0
  3. 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 был отключен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top