PHP Cronjob - 权限被拒绝?

时间:2011-07-07 03:24:29

标签: php cron crontab

所以,我设置了一个cronjob来运行以下命令:

php /var/www/path/to/cron/do-stuff.php

路径正确。该目录归www-data所有。

该脚本执行以下操作:

chdir( getcwd() );
echo shell_exec('whoami');

$handle = fopen(uniqid('TEST_') . '.tst');
fwrite($handle, 'foo');
fclose($handle);

这是我在尝试运行cron作业时得到的输出:

www-data
PHP Warning:  fopen(TEST_4e15266d09fa2.tst): failed to open stream: Permission denied

然而,当使用su www-data从shell执行此操作时,脚本执行得很好并生成测试文件而没有打嗝。

知道为什么会这样吗?

编辑:我想su www-data可能是不必要的,因为php会运行,但是我试过以防万一。然而,正如您从输出中看到的那样,cron和脚本执行为www-data

3 个答案:

答案 0 :(得分:5)

您是否尝试将完整路径放在fopen函数中而不仅仅是文件名?

答案 1 :(得分:2)

cron作业以完全不同的方式处理PATH。 从命令行调用时通常工作的相同脚本如果没有指定PATH,则在从crontab调用它时会返回这样的权限错误。

尝试更改该行:

$handle = fopen(uniqid('TEST_') . '.tst');

就像这样:

$handle = fopen('/var/www/vhosts/yourpath/'.uniqid('TEST_') . '.tst');

它对我有用。

答案 2 :(得分:0)

我确信即使这是在cron中,PHP本身仍然以其默认用户身份运行(当然,这可能会有所不同)并且这无法合理地更改。我可能错了。尝试将目录分组到PHP系统用户(apache?)并授予组写权限。然后看看是否有效。