【问题标题】:Parse error when run by cron but not from command line?由cron运行但不是从命令行运行时解析错误?
【发布时间】:2010-01-19 15:44:01
【问题描述】:

所以我有一个执行 PHP 脚本的 cronjob,如下所示:

0 0 * * * /usr/local/bin/php -f /home/mysite/mysite.com/cronjobs/renewal_email.php

如果我从命令行发出相同的命令,它运行时不会出错,并且使用 l 标志运行时不会显示语法错误。但是 cron 通过电子邮件发送以下内容:

解析错误:语法错误,意外的 T_OBJECT_OPERATOR

有问题的行是

$courses[$t->CourseNumber] = $t->course()->CourseName;

这些有限的信息是否会引发任何危险信号?任何人都知道为什么这应该在 cron 下而不是在命令行下发生?

// 编辑添加 DreamHost 支持响应。脚本正在处理此更改。

服务器上 PHP 的默认版本是 PHP4。这是因为服务器使用 PATH 设置而不是 Apache 来指定运行哪个版本。 PHP4 /usr/local/bin/php 的路径位于 PHP5 路径 /usr/local/php5/bin/php 之前,因此当您从 shell 键入 php 时,它总是首先运行。

要从 shell 运行 PHP5,您需要指定整个路径:

/usr/local/php5/bin/php --version

cron 用户不会使用您的 .bash_profile 路径,因此您需要在每个 cron 作业中指定 PHP5 的完整路径。

【问题讨论】:

  • 是否从该脚本中填充了 $t ?

标签: php command-line cron


【解决方案1】:

嗯。错误消息听起来像是您在 PHP4 解释器上运行 PHP5 脚本。但是,如果您使用完全相同的路径到 PHP 二进制文件,我看不出这是怎么发生的。

能否让 cron 作业执行 phpinfo() 并查看输出是什么?

对于 PHP 4,您必须重写指令:

$temp = $t->course(); 
$courses[$t->CourseNumber] = $temp->CourseName;

【讨论】:

  • 是的,Dreamhost 有 CLI 版本 PHP 4.4.8 和 PHP 版本 5.2.6 否则。对此有什么可做的吗?谢谢。
  • @jerry: 在你的 shell 配置文件中更改你的 php 版本或使用你的选项卡中的完整路径。
  • 所以 DreamHost 支持回应了版本问题,我的脚本现在运行成功!耶。谢谢佩卡的帮助!!我会将 DH 的回复添加到我的帖子中。
【解决方案2】:

我会说你正在使用两个不同版本的 PHP。从命令行运行 which php 会产生与您在 cron 选项卡中使用的路径不同的路径吗?

【讨论】:

    【解决方案3】:

    该错误意味着您的变量不包含对象。在运行 cron 作业时尝试 var_dump:ing 它。

    【讨论】:

    • 我不认为这是正确的。这是一个解析错误。该脚本未运行和实例化对象。编译失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多