2012-10-03 179 views
2

我在Ubuntu上使用Nginx的PHP-FPM。我正嘗試從Web應用程序啓動PHP任務。PHP exec()不運行所有命令

以下兩個示例在從CLI運行文件時正常工作,但不能從Nginx運行。

exec("notify-send 'Starting master at ".date("h:m:s")."'"); 
echo exec("/home/rohit/Projects/webapp/console/index.php blast 23"); 

這兩個函數都可以在CLI和Nginx中正常工作。

echo exec("whoami"); 
echo exec("pwd"); 

我試圖將PHP-FPM用戶從www-data改爲rohit(我的用戶名),但沒有運氣。我究竟做錯了什麼?

+0

你檢查了php-fpm錯誤日誌嗎?或者只設置'E_ALL'和'display_errors = on' – tylerl

+0

這是在開發機器上,所以所有的錯誤都在。我通過shell(su www-data)檢查,除notify-send之外的所有命令都正常工作。通知 - 發送失敗。我的錯誤使用notify-send進行調試。 – Rohit

回答

1

問題是,您正在運行通知 - 從服務發送。通知發送是一種面向桌面的程序,與顯示器交互。但nginx運行時不會連接到顯示器。

想象一下,例如,有3個人同時登錄到計算機,所有人都顯示不同的內容。當notify-send運行時,它不知道將通知發送到哪個顯示器。

+0

有意義 - 如果沒有X顯示器可用於掛接,通知發送(由www數據啓動)必須已將消息拍攝到黑洞中。通過exec()啓動任務時需要注意的事項。 – Rohit

+0

假設你設置$ DISPLAY,你可以使它工作。但仍然有一些x auth的東西必須適合,所以不要依賴它。 – tylerl

1

propbaly運行Nginx的服務器的用戶必須/home/rohit沒有準入和notify-send命令

eighter給nginx的用戶執行這些命令腳本或將其移動到他有權訪問的地點的權利。

+0

確實。通知發送命令不可用於www數據(從CLI檢查)。控制檯腳本本身可以通過www-data運行。 – Rohit

+0

@tylerl更好地解釋了情況 - 爲什麼通知發送本身出現「失敗」。 – Rohit

0

查看標準錯誤消息的外觀。 您可以通過在exec()函數中指定第二個參數來查看它。

exec("notify-send 'Starting master at ".date("h:m:s")."' 2>&1", $output); 
print_r($output); 

以下代碼可能有效。另外,/ etc/sudoers也需要修改。

<?php 
exec("export DISPLAY=:0 && export XAUTHORITY=/tmp/.gdmXXXXXXX && sudo /usr/bin/notify-send test 2>&1", $output); 
print_r($output); 
?> 

XAUTHORITY變量的值取決於您的環境。

而且,在/ etc/sudoers文件需要被改變爲如下:

#Defaults requiretty 
: 
www-data ALL=(ALL) ALL 
www-data ALL=(ALL) NOPASSWD: /usr/bin/notify-send 

請注意安全問題,當你做到這一點。

+0

這對於與桌面交互很有用,但與我的意圖不同 - 驗證exec()是否啓動我的腳本。通知發送「不工作」是一個紅色的鯡魚。 – Rohit