从 crontab 执行 PHP

从 crontab 执行 PHP

我正在利用 crontab 执行 PHP 文件,如下所示:

0 4 * * * /opt/lampstack/php/bin/php /opt/lampstack/apache2/htdocs/tests/test.php

我很确定文件本身运行正常,因为如果我/opt/lampstack/php/bin/php /opt/lampstack/apache2/htdocs/tests/test.php在命令行中执行,我会得到预期的结果。

在 cron 日志中,我可以看到它在指定时间被​​调用,但 php 文件没有运行(php 代码只有一行写入日志文件的代码)。我想这可能与用户权限有关,所以我尝试强制以 root 身份执行它(通过将 root 放在时间和 /opt/lamp 之间...),但仍然没有成功。

有什么明智之言吗?

凯特

答案1

您可以尝试使用 -c 开关指定 php.ini 文件的路径,并使用 -f 开关指示要执行的文件。

0 4 * * * /opt/lampstack/php/bin/php -c /etc/php.ini -f /opt/lampstack/apache2/htdocs/tests/test.php

你可能还想打开display_errorserror_reporting

但我同意其他回复,这听起来像是日志文件本身的权限问题。如果您设置了全局 error_log 参数,则可以尝试error_log()在代码中回显某些内容。

答案2

不要忘记,从 Cron 运行时,您不会获得登录环境。从命令行运行时,您至少会获得一个配置文件,并且可能会运行其他配置文件,这些配置文件可能会设置环境和其他变量。

您还可以默认从 Cron 以 root 身份运行,并且可能需要以用户 www 身份运行,或者以您的 Web 环境设置的方式运行。

答案3

这听起来像是权限问题。

您要写入的文件的路径是什么?

该文件及其目录的权限是什么?

为了帮助您测试,请将脚本更改为如下内容:

<?php

$file = '/tmp/logfile.txt';

echo "I'm writing to $file\n";

if (! $fh = fopen($file, 'a')) {
    fwrite(STDERR, "ERROR: cannot write $file");
    exit(1);
}
fwrite($fh, "Stuff to write\n");
fclose($fh);

在 cron 中运行该程序。它会写入 STDOUT,这样您就会收到电子邮件。如果创建文件时出现问题,它还会写入 STDERR,这将导致更多电子邮件。

如果此脚本运行并且您收到错误,则确认问题是您无法写入您尝试通过 cron 写入的文件。

在这种情况下,要么写入 cron 有权访问的其他文件,要么将文件的权限更改为可由 cron 写入。

相关内容