ImageMagick: convertire png fallito tramite PHP e funziona tramite shell bash
-
06-07-2019 - |
Domanda
Ho un bug molto strano che devo ancora trovare una soluzione. AGGIORNAMENTO vedi la soluzione di seguito
Quello che sto cercando di fare è convertire un'immagine a dimensione intera in una miniatura di 160x120. Funziona alla grande con file jpg e jpeg di qualsiasi dimensione, ma non 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'
Funzione PHP (abbreviata)
...
$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));
}
Quando questa funzione esegue $ retval è uguale a 1, il che significa che il comando di conversione non è riuscito (la miniatura non è stata creata).
È qui che diventa interessante, se eseguo esattamente lo stesso comando nella mia shell, funziona.
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$
Ho provato a utilizzare diverse funzioni PHP come sistema, passthru ma non ha funzionato. Pensavo che qualcuno qui conoscesse la soluzione.
Sto usando
-
MAMP 1.7.2
-
Apache / 2.0.59
-
PHP / 5.2.6
-
Grazie!
Aggiorna
Ho aggiornato le seguenti dipendenze
-
libpng dall'1.2.35 all'1.2.37
-
libiconv da 1.12_2 a 1.13_0
-
ImageMagick da 6.5.2-4_1 a 6.5.2-9_0
Tuttavia, non ha risolto il mio problema.
2 ° AGGIORNAMENTO
Alla fine ho trovato qualcosa che potrebbe aiutare, quando la funzione è in esecuzione questo è ciò che viene stampato nei registri di 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 ° AGGIORNAMENTO
libiconv.2.dylib è la versione 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 ° AGGIORNAMENTO
Il problema era correlato a MAMP, vedere la soluzione di seguito
Soluzione
Risolto!
Si scopre che la variabile di ambiente DYLD_LIBRARY_PATH
non è stata impostata correttamente.
Mac OS X Leopard viene fornito con libiconv 7.0.0 ma la conversione richiede 8.0.0 (vedere il 2 ° AGGIORNAMENTO sopra)
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 e tutte le dipendenze sono state installate con MacPorts in / opt / local
. Ciò richiede l'aggiunta manuale del percorso / opt / local / lib a DYLD_LIBRARY_PATH
.
Se aggiungo il percorso / opt / local / lib
a DYLD_LIBRARY_PATH
nel file Mac OS X Leopard apachectl
envvars / usr / sbin / envvars
non funziona. Perché? È perché non uso Apache da Mac OS X Leopard, utilizzo MAMP.
MAMP ha il suo script apachectl ed è il suo file envvars.
Ho aggiunto il percorso / opt / local / lib
a DYLD_LIBRARY_PATH
nel file MAMP apachectl
envvars / Applications / MAMP / Libreria / bin / envvars
DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
Ora le mie miniature PNG vengono generate e non vengono generati errori nel registro errori di Apache!
Spero che questo possa aiutare qualcuno e la prossima volta mi ricorderò di controllare tutti i file di registro prima di chiedere aiuto!
Phil
Altri suggerimenti
Il mio percorso era / opt / local / bin, ma anche aggiungerlo a DYLD_LIBRARY_PATH non funzionava. Alla fine, quando ho cambiato semplicemente il solo PATH, ha funzionato tramite PHP.
; Non ha funzionato ...
; DYLD_LIBRARY_PATH = " / opt / local / bin: / Applications / MAMP / Library / lib: $ DYLD_LIBRARY_PATH "
; esporta DYLD_LIBRARY_PATH
; Questo funziona!
export PATH = " $ PATH: / opt / local / bin "
Assicurati che l'utente che esegue il codice php abbia le stesse autorizzazioni su file e directory.
Questi dovrebbero essere ovvi, ma assicurati di controllare cose come la modalità sicura PHP, open_basedir e se exec
è stato disabilitato.