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

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

Grazie!

Aggiorna

Ho aggiornato le seguenti dipendenze

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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top