2009-06-19 9 views
5

Ho un bug molto strano che non ho ancora trovato una soluzione. UPDATE vedi soluzione sottoImageMagick: conversione png fallita via PHP e funziona tramite shell bash

Quello che sto cercando di fare è convertire un'immagine a grandezza naturale in una miniatura 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 (abbreviato)

... 
$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 viene eseguito $ retval uguale a 1 che significa che il comando di conversione non riuscita (miniatura non è stato creato).

Questo è il punto in cui 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 con funzione PHP diverso come il sistema, passante ma non ha funzionato. Pensavo che forse qualcuno qui conoscesse la soluzione.

sto usando

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

Grazie!

UPDATE

ho aggiornato le seguenti dipendenze

  1. libpng from 1.2.35 to 1.2.37
  2. libiconv from 1.12_2 to 1.13_0
  3. ImageMagick 6.5.2-4_1 to 6.5.2-9_0

Tuttavia, non ha risolto i miei probl em.

2 ° UPDATE

ho finalmente trovato qualcosa che potrebbe aiutare, quando la funzione gestisce questo è ciò che viene stampato nei log 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 ° UPDATE

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

problema era legato a MAMP, vedere soluzione qui di seguito

+1

Grazie mille! –

risposta

7

Risolto!

Si scopre che la variabile di ambiente DYLD_LIBRARY_PATH non è stata impostata correttamente.

Mac OS X Leopard è dotato di libiconv 7.0.0 ma convertito richiede 8.0.0 (vedi 2 ° UPDATE 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 è stato installato con MacPorts sotto /opt/local. Ciò richiede di aggiungere manualmente il percorso/opt/local/lib a DYLD_LIBRARY_PATH.

Se aggiungo il percorso /opt/local/lib-DYLD_LIBRARY_PATH nei Mac OS X Leopard apachectl envvars il file /usr/sbin/envvars non funziona. Perché? È perché non uso apache da Mac OS X Leopard, ma uso MAMP.

MAMP ha una propria scrittura apachectl ed è proprio file di envvars.

ho aggiunto il percorso /opt/local/lib-DYLD_LIBRARY_PATH nel MAMP file di apachectl envvars /Applications/MAMP/Library/bin/envvars

DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH" 

Ora i miei miniature PNG vengono generati e nessun errore vengono generati nel log degli errori di Apache!

Spero che questo aiuti qualcuno e la prossima volta mi ricorderò di controllare tutti i file di registro prima di chiedere aiuto!

Phil

+0

Stavo per suggerire che si trattava di un problema specifico di Leopard dopo aver letto sul problema COMMAND_MODE. Bel lavoro :) – defines

+0

uomo questo non funziona per me e sto tirando i miei capelli qui ... qualsiasi altra istruzione non menzionata qui avresti potuto fare? – mga

+0

ciao ... Potrei creare un "mondo ciao" come 'exec (" convert logo: logo.gif ")' e funziona bene ... tuttavia, una conversione più complessa funzionerà nella shell ma non in exec() : '/ opt/local/bin/convert -size 758x185 /Applications/MAMP/htdocs/recetas/img/photo/old.tmp -crop 470x185 + 142 + 0! -quality 100 + profile "*"/Applications/MAMP/htdocs/recetas/img/photo/new.jpg' ... Sto creando logo.gif nella stessa dir di old.tmp quindi non è questione di percorsi (inoltre, la cosa funziona se copio/incollo il comando in bash o sh. L'errore in apache (nessun errore php) è 'sh: command_here: No such file or directory' – mga

1

Assicurarsi che l'utente che esegue il codice php ha le stesse autorizzazioni per i file e le directory.

+0

Sì, entrambe le immagini e la cartella thumbs sono anche scrivibili a livello mondiale. – philhq

0

Questi dovrebbero essere ovvi, ma assicurati di controllare le cose come PHP safe mode, open_basedir, e se exec è stato disabilitato.

+0

Non sono disabilitati, sono stato in grado di generare miniature da file JPG e JPEG ma non da file PNG.Vedi la soluzione sotto – philhq

5

Il mio percorso è stato/opt/local/bin, ma anche aggiungendo che a DYLD_LIBRARY_PATH non ha funzionato. Alla fine, quando ho cambiato il PATH, ha funzionato tramite PHP.

; non ha funzionato ...

; DYLD_LIBRARY_PATH = "/ opt/local/bin:/Applications/MAMP/Library/lib: $ DYLD_LIBRARY_PATH"

; esportazione DYLD_LIBRARY_PATH

; Funziona!

export PATH = "$ PATH:/opt/local/bin"

+0

Grazie, grazie, grazie! mi ha aiutato a risolvere il problema :) – Stiropor

+0

Grazie! So che questi commenti "grazie" sono scoraggiati, ma questo ha posto fine a una lunga e confusa battaglia per me. –

Problemi correlati