Pergunta

Eu tenho um bug muito estranho que eu ainda tenho que encontrar uma solução. Atualizar ver solução abaixo

O que estou tentando fazer é converter uma imagem de tamanho completo em uma miniatura de 160x120. Ele funciona muito bem com arquivos JPG e JPEG de qualquer tamanho, mas não com 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'

função PHP (encurtado)

...
$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 esta função é executado $ equivalente 1 retval o que significa que o comando de conversão falhou (em miniatura não é criado).

Aqui é onde fica interessante, se eu executar exatamente o mesmo comando em minha concha, ele 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$ 

Eu tentei usar a função PHP diferente, como sistema, intermediário, mas não funcionou. Eu pensei que talvez alguém aqui sabia a solução.

Eu estou usando

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

Obrigado!

Atualizar

Eu atualizei as seguintes dependências

  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

No entanto, ele não resolver o meu problema.

2 update

Eu finalmente encontrei algo que pode ajudar, quando a função é executado isto é o que será impresso nos logs do 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ª ACTUALIZAÇÃO

libiconv.2.dylib é a versão 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 update

O problema estava relacionado com MAMP, consulte solução abaixo

Foi útil?

Solução

Resolvido isso!

Acontece que a variável environement DYLD_LIBRARY_PATH não foi definido corretamente.

Mac OS X Leopard vem com libiconv 7.0.0 mas converso requer 8.0.0 (ver 2º ATUALIZAÇÃO acima)

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 todas as dependências foi instalado com MacPorts sob /opt/local. Isso requer para adicionar manualmente o caminho / opt / local / lib para DYLD_LIBRARY_PATH.

Se eu adicionar o /opt/local/lib caminho para DYLD_LIBRARY_PATH no arquivo envvars apachectl /usr/sbin/envvars Mac OS X Leopard não funciona. Por quê? É porque eu não uso o apache de Mac OS X Leopard, eu uso MAMP.

MAMP tem o seu próprio roteiro apachectl e é própria Envvars arquivo.

Eu adicionei o /opt/local/lib caminho para DYLD_LIBRARY_PATH no arquivo envvars apachectl MAMP /Applications/MAMP/Library/bin/envvars

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

Agora minhas miniaturas PNG estão sendo gerados e sem erros são gerados no log de erro apache!

Espero que isso vai ajudar alguém e da próxima vez eu vou lembre-se de verificar todos os registros de arquivos antes de pedir ajuda!

Phil

Outras dicas

O meu caminho era / opt / local / bin, mas mesmo acrescentando que a DYLD_LIBRARY_PATH não funcionou. Finalmente, quando eu mudei simplesmente PATH ole, funcionou via PHP.

; Não funcionou ...

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

; exportação DYLD_LIBRARY_PATH

; Isso funciona!

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

Certifique-se de que o usuário executar o código PHP tem as mesmas permissões nos arquivos e diretórios.

Estes devem ser óbvio, mas certifique-se de verificar as coisas como modo de segurança PHP, open_basedir, e se exec foi desativado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top