У меня есть сценарий 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
Я рекомендую следующее:
использовать последнюю версию 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
Согласно руководству 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