У меня есть скрипт php, в котором мне нужно преобразовать документы doc в файлы 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
Я рекомендую следующее:
используйте последнюю версию unoconv (как минимум v0.7, когда она будет выпущена, или основную ветку от GitHub сегодня)
используйте самый последний стабильный выпуск LibreOffice (последние выпуски используют меньше памяти, обычно работают намного быстрее и с меньшими сбоями)
используйте собственный двоичный файл Python 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