Qual é a melhor maneira de executar o unoconv no php no servidor debian?

2

Eu tenho um script php no qual eu preciso converter documentos doc para arquivos html, a fim de mostrá-los em uma página da web.

Eu estou fazendo a conversão com o comando php:

exec ( $Command, $Output, $ReturnValue ) ;

onde

$Command = "/usr/bin/timeout -s 9 $TimeOut /usr/bin/unoconv -f html -o " . escapeshellarg($Dir) . " " . escapeshellarg($File) ;

Aparentemente tudo funciona bem, mas às vezes o processo não termina, e eu continuo com centenas de soffice.bin , unoconv , oosplash processa qual desperdício de memória RAM e definitivamente falha o servidor.

Estou faltando alguma coisa?

Existe uma maneira melhor de invocar unoconv ?

Devo executar o servidor unoconv como um serviço do sistema?

Eu estou usando: LibreOffice 3.5, Unoconv 0.5, apache 2.2.22-13 + deb7u4

    
por Paolo Benvenuto 27.05.2015 / 11:16

2 respostas

4

Eu recomendo o seguinte:

  • use a versão mais recente do unoconv (pelo menos v0.7 quando for lançado, ou a ramificação principal do GitHub hoje)

  • use a versão estável mais recente do LibreOffice (versões recentes usam menos memória, geralmente são muito mais rápidas e causam menos falhas)

  • use o binário nativo do LibreOffice python para executar unoconv, por exemplo. /opt/libreoffice4.4/program/python / usr / bin / unoconv -f arquivo pdf.doc

  • codifique o caminho do python no script unoconv shebang, portanto, coloque na primeira linha #! / opt / libreoffice4.4 / program / python em vez de #! / usr / bin / env python. (O Apache / PHP geralmente não define o PATH, então o unoconv falha)

  • garanta que o usuário que está executando o unoconv tenha acesso de gravação ao seu diretório HOME

Se você fizer o acima, tudo deve funcionar bem. Se o LibreOffice ainda falhar, você deve levar isso para o projeto upstream. Também tome cuidado, pois o LibreOffice não pode manipular mais de uma conexão / cliente ao mesmo tempo, então, idealmente, seu script PHP deve bloquear e / ou enfileirar corretamente os pedidos. (Veja o utilitário do sistema flock para isso)

Se você ainda tiver algum problema, denuncie-o para: link

    
por 07.07.2015 / 16:45
0

De acordo com o manual, man unoconv pode ser executado no modo ouvinte e no modo cliente. No modo cliente, ele procurará uma instância em execução e criará uma se não puder encontrar uma.

Você pode tentar executar uma instância no modo ouvinte e alterar seu comando para se conectar a essa instância. Pelo menos, você economizará alguns recursos evitando a necessidade de executar novas instâncias todas as vezes.

Aqui está um exemplo retirado do manual (execute listener e faça algumas conversões):

unoconv --listener &
unoconv -f pdf some-document.odt
unoconv -f doc other-document.odt
unoconv -f jpg some-image.png
unoconv -f xsl some-spreadsheet.csv
    
por 27.05.2015 / 12:18