ImageMagick: convierte png fail a través de PHP y funciona a través de bash shell
-
06-07-2019 - |
Pregunta
Tengo un error muy extraño que aún no he encontrado una solución. ACTUALIZACIÓN vea la solución a continuación
Lo que intento hacer es convertir una imagen a tamaño completo en una miniatura de 160x120. Funciona muy bien con archivos jpg y jpeg de cualquier tamaño, pero no con png.
Comando 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'
Función PHP (acortada)
...
$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));
}
Cuando esta función ejecuta $ retval igual a 1, lo que significa que el comando de conversión falló (no se creó la miniatura).
Aquí es donde se pone interesante, si ejecuto exactamente el mismo comando en mi shell, funciona.
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$
He intentado usar diferentes funciones de PHP como system, passthru pero no funcionó. Pensé que tal vez alguien aquí conocía la solución.
Estoy usando
-
MAMP 1.7.2
Apache/2.0.59
PHP/5.2.6
¡Gracias!
UPDATE
Actualicé las siguientes dependencias
-
libpng de 1.2.35 a 1.2.37
-
libiconv de 1.12_2 a 1.13_0
-
ImageMagick 6.5.2-4_1 a 6.5.2-9_0
Sin embargo, no solucionó mi problema.
2ª ACTUALIZACIÓN
Finalmente encontré algo que podría ayudar, cuando la función se ejecuta esto es lo que se imprime en los registros de 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ª ACTUALIZACIÓN
libiconv.2.dylib es la versión 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)
4ta ACTUALIZACIÓN
El problema estaba relacionado con MAMP, vea la solución a continuación
Solución
¡Lo resolvió!
Resulta que la variable de entorno DYLD_LIBRARY_PATH
no se configuró correctamente.
Mac OS X Leopard viene con libiconv 7.0.0 pero la conversión requiere 8.0.0 (consulte la segunda ACTUALIZACIÓN más arriba)
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 y todas las dependencias se instalaron con MacPorts en / opt / local
. Esto requiere agregar manualmente la ruta / opt / local / lib a DYLD_LIBRARY_PATH
.
Si agrego la ruta / opt / local / lib
a DYLD_LIBRARY_PATH
en Mac OS X Leopard apachectl
archivo envvars / usr / sbin / envvars
no funciona. ¿Por qué? Es porque no uso apache de Mac OS X Leopard, uso MAMP.
MAMP tiene su propio script apachectl y su propio archivo envvars.
Agregué la ruta / opt / local / lib
a DYLD_LIBRARY_PATH
en el archivo envvars apachectl
de MAMP / Applications / MAMP / Biblioteca / bin / envvars
DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
¡Ahora se generan mis miniaturas PNG y no se generan errores en el registro de errores de apache!
¡Espero que esto ayude a alguien y la próxima vez recordaré revisar todos los archivos de registro antes de pedir ayuda!
Phil
Otros consejos
Mi ruta era / opt / local / bin, pero incluso agregar eso a DYLD_LIBRARY_PATH no funcionó. Finalmente, cuando cambié simplemente la RUTA simple, funcionó a través de PHP.
; No funcionó ...
; DYLD_LIBRARY_PATH = " / opt / local / bin: / Applications / MAMP / Library / lib: $ DYLD_LIBRARY_PATH "
; exportar DYLD_LIBRARY_PATH
; ¡Esto funciona!
export PATH = " $ PATH: / opt / local / bin "
Asegúrese de que el usuario que ejecuta el código php tenga los mismos permisos en los archivos y directorios.
Esto debería ser obvio, pero asegúrese de verificar cosas como el modo seguro de PHP, open_basedir y si exec
ha sido deshabilitado.