ImageMagick: конвертировать png не удалось через PHP и работает через оболочку bash - PullRequest
5 голосов
/ 19 июня 2009

У меня очень странная ошибка, которую мне еще предстоит найти. ОБНОВЛЕНИЕ см. Решение ниже

Я пытаюсь преобразовать полноразмерное изображение в миниатюру 160x120. Отлично работает с файлами jpg и jpeg любого размера, но не с 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

Спасибо!

UPDATE

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

  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, см. Решение ниже

Ответы [ 4 ]

7 голосов
/ 20 июня 2009

Решил!

Оказывается, переменная окружения 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.

MAMP имеет собственный скрипт apachectl и собственный файл envvars.

Я добавил путь /opt/local/lib к DYLD_LIBRARY_PATH в файле MAMP apachectl envvars /Applications/MAMP/Library/bin/envvars

DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"

Теперь генерируются мои миниатюры PNG, и в журнале ошибок apache не генерируются ошибки!

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

Phil

5 голосов
/ 09 января 2010

Мой путь был / opt / local / bin, но даже добавление его в DYLD_LIBRARY_PATH не сработало. Наконец, когда я изменил просто обычный путь, он работал через PHP.

; Не работает ...

; DYLD_LIBRARY_PATH = "/ Opt / местные / бен: / Applications / MAMP / Библиотека / Библиотека: $ DYLD_LIBRARY_PATH"

; экспорт DYLD_LIBRARY_PATH

; Это работает!

export PATH = "$ PATH: / opt / local / bin"

1 голос
/ 19 июня 2009

Убедитесь, что у пользователя, запускающего код php, такие же права на файлы и каталоги.

0 голосов
/ 20 июня 2009

Это должно быть очевидно, но убедитесь, что вы проверили такие вещи, как безопасный режим PHP, open_basedir и был ли exec отключен

...