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

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

¡Gracias!

UPDATE

Actualicé las siguientes dependencias

  1. libpng de 1.2.35 a 1.2.37
  2. libiconv de 1.12_2 a 1.13_0
  3. 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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top