Несмотря на ваш $ PATH, на который ссылался 01010, я бы так не сделал.
LibreOffice - довольно большая программа, имеет много кода, о котором вы не знаете, он генерирует и обновляет файлы в каталоге вашего $ HOME, и, конечно же, вы не сможете запустить больше чем одна копия за раз.
Таким образом, вместо того, чтобы LibreOffice запускался на вашем веб-сервере и подрывал безопасность Apache, запустив его как более привилегированный пользователь, чем «www-data» или «nobody», вы должны сделать обработчик.
Прежде всего, убедитесь, что вы можете запустить командную строку libreoffice ...
с терминала. Чтобы быть уверенным, что у вас нет зависимостей X11, запустите unset DISPLAY
(для bash) или unsetenv DISPLAY
(для tcsh) на вашем xterm перед тем, как вы проверите свою командную строку. Разрывается ли это? Сначала исправьте эту проблему. Это работает? Отлично, тогда продолжайте работу с обработчиком.
Ваш обработчик в его простейшей форме может быть сценарием, который навсегда зацикливается, проверяя «файлы для обработки» в каталоге спула, и если он их находит, преобразует их с помощью libreoffice и помещает результирующий файл, где он может можно найти в веб-приложении.
#!/bin/sh
while sleep 10; do
if [ `ls /var/tmp/myspool/ | grep -c '\.xlsx$'` -gt 0 ]; then
ls /var/tmp/myspool/*.xlsx | while read file; do
/usr/local/bin/libreoffice --headless -convert-to ooxml "$file" yadda yadda
if [ $? = 0 ]; then
mv "$file" "/var/tmp/myspool/done/
fi
done
fi
done
Если вы не хотите, накладные расходов на что-то «опрос» (проверка буферного каталога каждые 10 секунд), то вы можете иметь ваш PHP скрипт добавить строку в журнал, который получает наблюдаемый от обработчика. Например:
<?php
// process form, save file to spool dir
syslog(LOG_NOTICE, "Saved: " . $filename);
?>
Убедитесь, что вы настроили системный журнал для хранения этих сообщений, скажем, /var/log/filelog
, то обработчик может просто хвост журнала.
#!/bin/sh
tail -F /var/log/filelog | while read line; do
filename="`echo \"$line\" | sed 's/.*Saved: //'`"
/usr/local/bin/libreoffice --headless -convert-to ooxml "$file" yadda yadda
# etc ... error handling and mv as in the other script
done
Получите идею?
Попробуйте указать полный путь к 'libreoffice' в вашей команде, например '/ usr/local/bin/libreoffice' или там, где он установлен, и посмотрите, поможет ли это вам немного дальше. – drew010
рискует быть глупым - exec() не вернет сообщение об ошибке, вы уверены, что он терпит неудачу? вы попробовали passthru()? – Michal