Что лучший способ состоит в том, чтобы выполнить unoconv в php на debian сервере?

У меня есть сценарий 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, апач 2.2.22-13+deb7u4

2
задан 17 July 2017 в 13:03
2 ответа

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

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

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

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

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

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

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

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

4
ответ дан 3 December 2019 в 10:01

Согласно руководству 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
0
ответ дан 3 December 2019 в 10:01

Теги

Похожие вопросы