簡體   English   中英

PHP如何執行命令

[英]PHP how to execute a command

我正在嘗試使用LibreOffice將電子表格轉換為另一種格式,當我從控制台執行命令時它運行正常但是當我使用exec()或system()從PHP執行它時它不起作用。 它沒有顯示任何錯誤或任何東西,它只是默默地失敗,如果我嘗試執行一些簡單的命令,如“ls”它工作得很好。

這是我正在使用的命令:

<?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上的apache User和Group更改為我所登錄的用戶。

我想知道問題是www文件夾是/ home而不是我的用戶內部並導致權限問題,但到目前為止無法使其工作。

任何幫助將不勝感激。

我用下面的命令解決了這個問題:

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在這里運行版本代碼www-data rights,它的主頁是/ var / www /,但默認這個目錄由root.enter代碼在這里擁有

在PHP中 - 你可以看到rigths:

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

在控制台中 - 您可以看到您的HOME並給出正確的權利:

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

雖然你的$ PATH,提到了010提到,但我不會這樣做。

LibreOffice是一個非常大的程序,有很多你不知道的代碼,它會在你的$ HOME目錄中生成和更新文件,當然你也不能運行多個副本一次。

因此,不要讓您的Web服務器啟動LibreOffice,並通過將其作為比“www-data”或“nobody”更具特權的用戶運行來破壞Apache的安全性,您應該創建一個處理程序。

首先,驗證您是否可以從終端運行libreoffice ...命令行。 為了確保您沒有任何X11依賴項,請在測試命令行之前在xterm中運行未unset DISPLAY (對於bash)或unsetenv DISPLAY (對於tcsh)。 它破了嗎? 首先解決這個問題。 它有用嗎? 很好,然后繼續處理程序。

您的處理程序,最簡單的形式,可以是一個永遠循環的腳本,檢查假脫機目錄中的“要處理的文件”,如果找到它們,使用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 ,然后你的處理程序可以只是拖尾日志。

#!/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

明白了嗎?

我之前也遇到過同樣的問題.....

這個解決方案似乎對我有用......

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM