2012-03-06 5 views
3

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

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

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

Я уже попытался изменить апачский пользователя и группы по /opt/lampp/etc/httpd.conf к тому же зарегистрированный пользователь я.

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

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

+0

Попробуйте указать полный путь к 'libreoffice' в вашей команде, например '/ usr/local/bin/libreoffice' или там, где он установлен, и посмотрите, поможет ли это вам немного дальше. – drew010

+0

рискует быть глупым - exec() не вернет сообщение об ошибке, вы уверены, что он терпит неудачу? вы попробовали passthru()? – Michal

ответ

3

Несмотря на ваш $ 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 

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

+0

Спасибо, это похоже на хороший подход. Я давно перешел от этой проблемы, но в следующий раз я попробую это. – Flupkear

5

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

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

Спасибо, я попробую. – Flupkear

+0

Аналогичная идея здесь (http://superuser.com/questions/627266/convert-file-to-pdf-using-libreoffice-under-user-apache-i-e-when-using-php). –

+0

Вы экономите мой день !, волшебство было -> HOME =/tmp, я думаю, это было потому, что у пользователя apache нет какой-либо $ HOME-папки. – Lyoneel

4

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

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 /, но по умолчанию этот каталог принадлежит корневому. здесь здесь

В PH P - вы можете увидеть rigths:

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

В консоли - Вы можете увидеть свой дом и дать правильные права:

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

Это работало для меня на Nginx под CentOS: * chown apache: apache/var/www -R *. Ты спас свой день. Спасибо. –

+0

Работайте для меня тоже на 'CentOS 6.3 x86_64'' libreoffice4.2' ... и самое важное большое спасибо вам сэр .. –

0

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

Этот решение кажется сработавшим для меня ...

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 
Смежные вопросы