PHP, как выполнить команду

Я пытаюсь использовать LibreOffice для преобразования таблицы в другой формат, когда я выполняю команду с консоли, она отлично работает, но когда я делаю это с PHP с помощью exec () или system (), это не работает. Он не показывает никакой ошибки или чего-то еще, он просто молча терпит неудачу, если я попытаюсь выполнить какую-то простую команду, например, «ls», она работает нормально.

Это команда, которую я использую:

<?php system("libreoffice --headless -convert-to ooxml '/home/www/path_to_app/file.xlsx' -outdir /home/www/path_to_app/"); 

Я уже пробовал сменить apache User и Group на /opt/lampp/etc/httpd.conf тому же зарегистрированному пользователю, которым я являюсь.

Мне интересно, проблема в том, что в папке www есть / home, а не внутри моего пользователя, и это вызывает проблемы с разрешениями, но пока не может заставить ее работать.

Любая помощь будет оценена.

Несмотря на ваш $ PATH, на который ссылался 010, я бы так не сделал.

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); ?> 

Убедитесь, что вы сконфигурировали syslog для хранения этих сообщений, скажем, /var/log/filelog , а затем ваш обработчик может просто /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 

Получите идею?

Я решил эту проблему с помощью следующей команды:

 system(' export HOME=/tmp libreoffice --headless --invisible --norestore --convert-to pdf --outdir /my/folder /my/file/calc.xls'); 

Я решил эту проблему с помощью следующей команды:

 exec('libreoffice --headless --invisible --norestore --convert-to pdf --outdir /my/folder /my/file/calc.xls'); 

Просто проверьте права, libreoffice использует домашнюю папку пользователя. Если вы используете настройки по умолчанию для Ubuntu, тогда PHP запускает eenter-код heren www-data rights, и это домашний / var / www /, но по умолчанию этот каталог принадлежит коду root.enter здесь

В PHP – вы можете увидеть rigths:

 exec('whoami', $arr); print_r($arr); 

В консоли – вы можете видеть свой ДОМ и давать правильные права:

 su wwww-data echo $HOME exit; chown www-data:www-data /var/www -R 

Я также столкнулся с такой же проблемой, прежде чем …..

Это решение, похоже, сработало для меня …

 function execInBackground($cmd) { if (substr(php_uname(), 0, 7) == "Windows"){ pclose(popen("start /B ". $cmd, "r")); } else { exec($cmd . " > /dev/null &"); } } $mainFile = "YOUR FILE"; $cmd2 = "export HOME=/tmp libreoffice --headless --invisible --norestore --convert-to pdf " . "'$mainFile'"; $saved = getenv("LD_LIBRARY_PATH"); // save old value $newld = "/usr/lib"; // extra paths to add if ($saved) { putenv("LD_LIBRARY_PATH=" . $newld); } // set new value // // command is loaded using // libs in the new path list execInBackground($cmd2); putenv("LD_LIBRARY_PATH=$saved"); // restore old value