What is the best way to run unoconv in php on debian server?

У меня есть PHP-скрипт, в котором мне нужно конвертировать документы в документы HTML, чтобы показать их на веб-странице.

Я делаю преобразование с помощью команды php:

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

где

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

Видимо все работает хорошо, но иногда процесс не заканчивается, и я остаюсь с сотнями soffice.bin, unoconv, oosplash процессы, которые тратят оперативную память и определенно приводят к краху сервера.

Я что-то пропустил?

Есть ли лучший способ вызвать unoconv?

Должен ли я запустить unoconv сервер как системный сервис?

Я использую: LibreOffice 3.5, Unoconv 0.5, apache 2.2.22-13+deb7u4

2 ответа

Решение

Я рекомендую следующее:

  • используйте последнюю версию unoconv (по крайней мере v0.7, когда она будет выпущена, или ветку master из GitHub сегодня)

  • использовать самый последний стабильный выпуск LibreOffice (последние выпуски используют меньше памяти, как правило, намного быстрее и меньше аварийно завершают работу)

  • используйте нативный двоичный файл LibreOffice для запуска unoconv, например. /opt/libreoffice4.4/program/python /usr/bin/unoconv -f pdf file.doc

  • жестко закодируйте путь python в сценарии unoconv shebang, поэтому поместите в первую строку #!/opt/libreoffice4.4/program/python, а не #!/usr/bin/env python. (Apache/PHP обычно не устанавливают PATH, поэтому unoconv завершается ошибкой)

  • убедитесь, что пользователь, работающий с unoconv, имеет доступ на запись в свой каталог HOME

Если вы делаете выше, все должно работать нормально. Если LibreOffice все еще дает сбой, вам следует заняться этим с помощью вышестоящего проекта. Также помните, что LibreOffice не может обрабатывать более одного соединения / клиента одновременно, поэтому в идеале ваш PHP-скрипт должен правильно блокировать и / или ставить запросы в очередь. (Посмотрите на утилиту системы flock для этого)

Если у вас все еще есть какие-либо проблемы, пожалуйста, сообщите о них по адресу: http://github.com/dagwieers/unoconv/issues

Согласно инструкции man unoconv может быть запущен в режиме прослушивателя и в режиме клиента. В режиме клиента он будет искать работающий экземпляр и создаст его, если не смог найти его.

Вы можете попробовать запустить один экземпляр в режиме прослушивателя и изменить команду для подключения к этому экземпляру. По крайней мере, вы сэкономите некоторые ресурсы, избегая необходимости каждый раз запускать новый экземпляр.

Вот пример, взятый из руководства (запустите слушатель и сделайте несколько преобразований):

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
Другие вопросы по тегам