Назад | Перейти на главную страницу

Как лучше всего запустить unoconv в php на сервере debian?

У меня есть скрипт 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