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