Eu tenho um script php no qual preciso converter documentos doc em arquivos html para mostrá-los em uma página da web.
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 fico com centenas de processos soffice.bin
, unoconv
, oosplash
que gastam ram e travam definitivamente o servidor.
Estou perdendo alguma coisa?
Existe uma maneira melhor de invocar unoconv
?
Devo executar o unoconv
servidor como um serviço do sistema?
Estou usando: LibreOffice 3.5, Unoconv 0.5, apache 2.2.22-13+deb7u4
Eu recomendo o seguinte:
use a versão mais recente do unoconv (pelo menos v0.7 quando for lançado, ou o branch master 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 travam menos)
use o binário python nativo do LibreOffice para executar o unoconv, por exemplo. /opt/libreoffice4.4/program/python /usr/bin/unoconv -f arquivo pdf.doc
codifique o caminho python no script unoconv shebang, então coloque na primeira linha #!/opt/libreoffice4.4/program/python em vez de #!/usr/bin/env python. (Apache/PHP geralmente não define PATH, então unoconv falha)
certifique-se de que o usuário 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 travar, você deve continuar com o projeto upstream. Também esteja ciente de que o LibreOffice não pode lidar com mais de uma conexão/cliente ao mesmo tempo, portanto, idealmente, seu script PHP deve bloquear e/ou enfileirar solicitações corretamente. (Veja o utilitário do sistema de rebanho para isso)
Se você ainda tiver algum problema, informe-o em: http://github.com/dagwieers/unoconv/issues
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 caso não encontre uma.Você pode tentar executar uma instância no modo ouvinte e alterar seu comando para se conectar a esta instância. Pelo menos, você economizará alguns recursos evitando a necessidade de executar uma nova instância toda vez.
Aqui está um exemplo retirado do manual (execute o listener e faça algumas conversões):