2015-04-03 110 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用户无法访问的目录,例如终端中的命令正在执行的当前工作目录。