用PHP设置定时任务

3

我试图从php设置cron作业,但每次尝试下面的代码时都无法工作。请告诉我这段代码有什么问题。

    $cron = $this->generator();
    file_put_contents("cron.txt", $cron);
    shell_exec('crontab cron.txt');

生成器函数可以使cron job字符串看起来像下面这样。
12 1 * * * /usr/bin/sample >/dev/null 2>&1

cron.txt文件没问题,它包含了所需的字符串,但是shell_exec不知道为什么无法工作。


你有任何错误吗? - D4V1D
1
通过 Web 服务器运行脚本吗?如果是,我假设 Web 服务器没有运行 crontab 的权限。 - venca
1
shell_exec()默认是关闭的..你确定它已经启用了吗? - Mohammad Alabed
我使用了exec和system命令,但它们都没有起作用。 - Rome
@Rominux,使用我的示例使用exec及其输出(甚至是返回)值,您可能能够记录或打印有关环境的一些有用细节。如果有帮助,您还可以使用“sudo -u yourWebUser”运行脚本,以查看在您的Web服务器尝试相同操作时的结果。 - Ali
3个回答

1
在谷歌博士的多次搜索之后,我找到了答案。我需要更改使用Apache用户,即www-data,因此命令更改为crontab -u www-data cron.txt

1

使用硬编码的$corn在本地运行您的脚本对我来说很好,我已经包含了几行代码来清除crontab,并确认该条目。请参见下面。

$cron = '12 1 * * * /usr/bin/sample >/dev/null 2>&1';

file_put_contents('cron.txt', $cron);

shell_exec('crontab -r');
shell_exec('crontab cron.txt');

// To check the result
$output = []; 
exec('crontab -l',$output);
print_r($output);

输出:

Array
(
    [0] => 12 1 * * * /usr/bin/sample >/dev/null 2>&1
)

这里有一种方法可以检查 crontab cron.txt 执行的结果:

$output = $return = [];
exec('crontab cron.txt',$output, $return);
var_dump($output, $return);

成功时不会有任何输出或返回。
array(0) {
}
int(0)

2
不行...这对我没用...我认为apache服务器可能存在权限问题...因为当我从终端使用完全相同的文件时,它可以正常工作。 - Rome
很可能,您需要确定以下事项:a. 您的 Web 服务器是否有权限写入 cron.txt 文件,如果有,则可以手动检查文件及其内容。b. 如果 Web 服务器有运行 crontab 的权限。如果在第一点上失败,您会收到类似于“PHP 警告:file_put_contents(cron.txt):无法打开流:权限被拒绝...”的提示信息。 - Ali
1
是的,最近我也遇到了你刚写的那个错误...但是cron文件已经创建和编辑完美了... - Rome
1
在这种情况下,cron.txt文件可能是由另一个用户创建的。现在,运行程序没有权限修改它。如果是这种情况,您可以通过手动删除文件并确保下一次脚本首先以您的Web服务器用户身份运行(即不要将其作为本地php脚本运行)来解决它。 - Ali
1
非常感谢您的帮助,我找到了解决方案... 我所要做的就是像下面这样为crontab标识用户: crontab -u www-data cron.txt - Rome

0
问题在于Apache服务器将作为一个单独的有限资源帐户运行,这个帐户本来不应该创建cron作业。这是一个相当容易让主机服务器受到攻击的方法。特别是如果它在公共可访问的IP地址空间中运行。
然而,如果环境是安全的,并且您的服务器管理员允许,您可以让Apache进程以更高的权限帐户(例如您自己)运行,或者使用suexec功能以指定带有有限但适当权限的帐户运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接