我试图让一个PHP脚本在crontab中运行,但是当在crontab中运行时,我从php得到一个包含错误。
crontab条目类似于:
* * * * * php /path/sendEmail.php > /path/logs/sendEmail/sendEmail-`date +\%Y-\%m-\%H\ \%k:\%M:\%S`.log 2>&1 &
这会创建日志文件但是在日志文件中我会收到一些php错误:
PHP Warning: include_once(../../../lib/Database.php): failed to open stream: No such file or directory in /path/sendEmail.php on line 6
Warning: include_once(../../../lib/Database.php): failed to open stream: No such file or directory in /path/sendEmail.php on line 6
PHP Warning: include_once(): Failed opening '../../../lib/Database.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /path/sendEmail.php on line 6
Warning: include_once(): Failed opening '../../../lib/Database.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /path/sendEmail.php on line 6
PHP Fatal error: Class 'Database' not found in /path/sendEmail.php on line 9
Fatal error: Class 'Database' not found in /path/sendEmail.php on line 9
当我在crontab条目中运行该命令时,我在日志文件中得到相同的错误。现在,当我在终端中运行php sendEmail.php
时,它工作得很好。电子邮件发出一切。在之前的情况下,我收到了错误(电子邮件也没有发送出去)。
不确定输出管道如何改变php脚本的运行方式。关于如何让php脚本作为cronjob运行的任何想法?
答案 0 :(得分:1)
当cron启动脚本时,其工作目录不太可能与PHP脚本所在的目录相同,因此../../../lib/Database.php
之类的相对路径是不可取的,至少在当前形式下是这样。
在脚本的顶部添加:
define('__SCRIPT_ROOT', dirname(__FILE__));
将您的包含更改为:
include_once(__SCRIPT_ROOT . '/../../../lib/Database.php');
现在__SCRIPT_ROOT
包含脚本的绝对路径,您可以将其用作执行相对路径的基础。