从命令行和crontab执行php时权限被拒绝

时间:2015-04-03 23:26:57

标签: php cron centos

我正在尝试在用户apache下创建一个cronjob,但是我获得了程序访问的文件的权限被拒绝错误。我的php脚本无法访问的特定文件是/var/www/html/amazon/amazon_data.txt。这是我检查权限,并测试是否可以写入文件:

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组中。

1 个答案:

答案 0 :(得分:3)

问题是由于请求的文件不是文字位置。这是不起作用的代码:

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