2015-04-03 109 views
0

我正在嘗試在用戶apache下創建一個cronjob,但是我得到權限被程序訪問的文件所拒絕的錯誤。我的php腳本無法訪問的特定文件是/var/www/html/amazon/amazon_data.txt。下面是我檢查的權限,及測試,看能不能寫入文件:從命令行執行php時權限被拒絕,而crontab

bash-3.2$ whoami 
apache 
bash-3.2$ ls -l /var/www/html/amazon/amazon_data.txt 
-rwxrwxr-- 1 apache apache 1082 Apr 3 15:43 /var/www/html/amazon/amazon_data.txt 
bash-3.2$ vi /var/www/html/amazon/amazon_data.txt 

現在,我嘗試運行,嘗試訪問該文件我得到這樣的警告的腳本:

bash-3.2$ /usr/bin/php /var/www/html/amazon/amazon_inventory_sync.php 
PHP Warning: Module 'json' already loaded in Unknown on line 0 
PHP Warning: fopen(amazon_data.txt): failed to open stream: Permission denied in /var/www/html/amazon/amazon_inventory_sync.php on line 26 

Warning: fopen(amazon_data.txt): failed to open stream: Permission denied in /var/www/html/amazon/amazon_inventory_sync.php on line 26 
Unable to open amazon_data.txt!bash-3.2$ 

爲什麼我可以在用戶通過命令行執行時訪問和編輯文件,而不是在php腳本中?從瀏覽器運行腳本時沒有問題。

編輯:我可以在用戶soh下正常運行,他在apache組中。 apache也在apache組中。

+0

誰分配給腳本? – nomistic 2015-04-03 23:46:28

+0

該腳本被分配給apache – 2015-04-03 23:48:47

+0

以及該文件的第26行發生了什麼? – nomistic 2015-04-04 00:00:13

回答

2

這個問題是由於被請求的文件不是字面位置。這是一個沒有工作的代碼:

$filename = "amazon_data.txt"; 
$file = fopen($filename, "a+") or die("Unable to open $filename!\n"); 

當腳本通過HTTP遠程運行,這可能工作得很好,但在終端運行cron作業或執行時,它可能會導致問題。將$filename更改爲完整位置解決了此問題。

$filename = dirname(__FILE__)."/"."amazon_data.txt"; 
$file = fopen($filename, "a+") or die("Unable to open $filename!\n"); 

爲什麼會發生這種情況?我猜測,而不是正在使用的PHP文件的文件夾,它使用的是apache用戶無法訪問的目錄,例如終端中的命令正在執行的當前工作目錄。