Php 帮助使用Kohana 3和CRON

Php 帮助使用Kohana 3和CRON,php,cron,kohana,kohana-3,Php,Cron,Kohana,Kohana 3,我已经设置了一个CRON来调用Kohana3中的URL php /home/user/public_html/index.php my/route/in/bootstrap.php 它似乎可以很好地访问URL 但是,我收到了此错误(通过主机通过CRON发送的电子邮件发回) 它位于Kohana系统文件中。这是因为CRON作业没有发送HTTP头吗 我将如何修复这个问题并使其正常工作(希望不破坏核心文件) 还是我做错了克朗 更新 Pekka提供了一个解决方案,但是我希望避免更改核心文件(尽管我会作

我已经设置了一个CRON来调用Kohana3中的URL

php /home/user/public_html/index.php my/route/in/bootstrap.php
它似乎可以很好地访问URL

但是,我收到了此错误(通过主机通过CRON发送的电子邮件发回)

它位于Kohana系统文件中。这是因为CRON作业没有发送HTTP头吗

我将如何修复这个问题并使其正常工作(希望不破坏核心文件)

还是我做错了克朗

更新 Pekka提供了一个解决方案,但是我希望避免更改核心文件(尽管我会作为最后手段)

Kohana 3似乎确实支持CLI,因为有一个静态属性
$is_CLI


您似乎已经打开了
E_STRICT
通知,Kohana的错误处理捕捉到了这一点
E_STRICT
会抱怨未定义的索引。该索引实际上是未定义的,因为当通过CLI调用时,PHP脚本中没有HTTP_主机

尽管如此,您的脚本仍有可能运行良好。您必须在某个时候关闭
错误报告
,以防止消息显示-我不太了解Kohana,不知道从CLI调用时是否可以使用其他配置文件


也许只需关闭特定控制器中的
错误报告()
就可以实现这一点,尽管这有点麻烦。

作为一般策略,我建议不要只关闭错误报告级别以消除错误

问题是,正如Pekka所说,
$\u SERVER['HTTP\u HOST']
没有在CLI模式下定义,
Url
类在生成绝对Url时需要这样做。在很多情况下都会发生这种情况,例如,当使用
$protocol
集调用
URL::site
时,或者当使用
Request::redirect()
时,或者当使用
提要
助手生成RSS提要时

您需要做的是确定您试图在CRONed控制器中生成绝对URL的位置,然后决定是否需要。如果您不需要它,那么删除有问题的代码,它就会正常运行。如果你这样做了,那么仅仅关闭错误对你没有帮助。相反,将其添加到
bootstrap.php
文件中:

if ( ! isset($_SERVER['HTTP_HOST'])
{
    $_SERVER['HTTP_HOST'] = '<your-domain-here>';
}
if(!isset($\u服务器['HTTP\u主机])
{
$\u服务器['HTTP\U主机']='';
}

您还需要确保将所需的协议(可能是“http”)显式传递到
URL::base
,而不是只传递
TRUE
。否则,它将使用当前协议,即
cli://

,另一个解决方案是设置cron命令,如下所示:


wget--timeout=99999-O/dev/null-q

这很奇怪,我不得不改变它,因为它似乎支持CLI(具有Kohana类的静态属性
$is_CLI
)我也将在Kohana论坛上发帖。非常感谢您的回答。@alex这可能只是一个疏忽。
E\u STRICT
不应该在生产环境中触发。(当然,更干净的方法是首先检查HTTP\u主机。)事实上,我可以关闭Kohana配置中的错误。我只是想能够在不关闭错误的情况下从这里测试我的CRON。我想我可以这样做。谢谢Pekka。@alex,不客气。如果你可以影响引导,你可以根据你是否在使用php_sapi_name的CRON作业中运行来打开/关闭错误:我想如果我这样做了不过,我无法在
PHP_SAPI
中测试
cli
,这意味着它可以从外部访问(除非我还检查了主机IP)。
if ( ! isset($_SERVER['HTTP_HOST'])
{
    $_SERVER['HTTP_HOST'] = '<your-domain-here>';
}