ImageMagick:PHP経由のpng変換が失敗し、bashシェル経由で動作する
-
06-07-2019 - |
質問
非常に奇妙なバグがありますが、まだ解決策を見つけていません。 更新以下の解決策を参照
私がやろうとしているのは、フルサイズの画像を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関数を使用しようとしましたが、機能しませんでした。ここの誰かが解決策を知っているかもしれないと思った。
使用しています
-
MAMP 1.7.2
-
Apache / 2.0.59
-
PHP / 5.2.6
-
ありがとう!
更新
次の依存関係を更新しました
-
1.2.35から1.2.37のlibpng
-
libiconvの1.12_2から1.13_0
-
ImageMagick 6.5.2-4_1から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
に手動で追加する必要があります。
Mac OS X Leopardの apachectl
envvarsファイル /で
は機能しません。どうして? Mac OS X LeopardのApacheを使用していないため、MAMPを使用しています。 DYLD_LIBRARY_PATH
にパス / opt / local / lib
を追加した場合usr / sbin / envvars
MAMP 独自の apachectlスクリプト独自の envvarsファイル。
パス / opt / local / lib
をMAMP apachectl
envvarsファイル / Applications / MAMP /の
DYLD_LIBRARY_PATH
に追加しました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 PATHを変更すると、PHP経由で機能しました。
;機能しませんでした...
; DYLD_LIBRARY_PATH =&quot; / opt / local / bin:/ Applications / MAMP / Library / lib:$ DYLD_LIBRARY_PATH&quot;
; export DYLD_LIBRARY_PATH
;これは動作します!
export PATH =&quot; $ PATH:/ opt / local / bin&quot;
PHPコードを実行しているユーザーがファイルとディレクトリに対して同じ権限を持っていることを確認してください。
これらは明白なはずですが、PHPセーフモード、open_basedirなど、および exec
が無効になっているかどうかを確認してください。