【问题标题】:PHP Classes not found with crontab使用 crontab 找不到 PHP 类
【发布时间】:2017-01-27 09:33:26
【问题描述】:

我有一个 PHP 脚本,可以读取电子邮件、保存附件、读取保存的 csv 文件并加载包含 csv 文件内容的数据库。 我使用 Jamesiarmes\PhpEws 库连接到我的 Exchange Server,一切正常。 由于每天都需要做,所以每天十点用crontab运行php脚本。

00 10 * * * /usr/bin/php /home/web/update/format-recent-report.php > /home/web/log/readmail.log 2> /home/web/log/readmail.err

当 Crontab 尝试运行脚本时会出现问题。 readmail.err 文件包含以下错误:

PHP 致命错误:在 'jamesiarmes\PhpEws\Client' 中找不到类 /home/web/update/exchange_config.php 在第 8 行

这里是exchange_config.php

<?php 
use \jamesiarmes\PhpEws\Client;
$host = 'xxx.xxxx.it';
$username = 'yyyyy';
$password = 'zzzzzz';
$version = Client::VERSION_2010;
?>

收到错误后,我转到脚本所在的目录并尝试手动运行脚本:

php format-recent-report.php > log

并且脚本可以正常工作。为什么 crontab 和手动有这种区别?

PHP脚本的内容我就不贴了,因为很长,但是可以说是开头的:

include '../vendor/autoload.php';
include 'exchange_config.php';

它从一开始就停止。

【问题讨论】:

  • 您的脚本可能不在您认为的目录中运行,您可以使用getcwd 来检查。使用绝对路径可以解决这个问题。
  • 您的路径不是绝对的,因此取决于当前的工作目录。显然,您尝试包含的文件没有被包含(这是您要解决的问题)。

标签: php class crontab


【解决方案1】:

如果您使用 cron 启动脚本,请始终使用文件的完整路径。

添加到脚本中的每个路径dirname(__FILE__) 并在必要时添加/

【讨论】:

  • @AD7six 这可能会解决特定问题,但您应该始终使用绝对路径来避免在使用.. 等遍历目录时可能出现的任何问题。使用绝对路径可以从一开始就避免这个问题。
  • @CharlotteDunois 实际上,我发现按照 OP 所说的那样做会更好,因为如果您更改环境,它仍然可以工作。如果使用绝对路径,则必须更改所有匹配项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2016-12-17
  • 1970-01-01
相关资源
最近更新 更多