所以,我设置了一个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
。
答案 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?)并授予组写权限。然后看看是否有效。