Cron Job $ _SERVER问题

时间:2012-02-03 12:12:33

标签: php cron

我想要运行一个cron工作。我的应用程序是用PHP和Mysql开发的。

在浏览器中,如果我在编码中使用$_SERVER[HTTP_HOST],它可以正常工作。但是,如果我在cron作业中使用相同的东西,它会给出错误。

任何机构都可以建议解决这个问题吗?

7 个答案:

答案 0 :(得分:17)

从cronjob运行时未填充

$_SERVER['HTTP_HOST'],不会通过HTTP访问该文件。

您将需要对主机进行硬编码或通过命令行参数传递它,并通过$_SERVER['argv']阵列访问它。

答案 1 :(得分:6)

当在命令行上执行php时,$_SERVER['HTTP_HOST'](当然)不可用。

您可以使用@符号来抑制错误,或使用构造线稍微谨慎一些:

$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI';

答案 2 :(得分:5)

如前所述,当您通过php-cli运行php时,$ _SERVER不存在。

虽然,有一个选项可以在php-cgi中运行你的cron'd脚本,你将拥有$ _SERVER。如果您卷曲到本地Web服务器,则将填充$ _SERVER。

$ cat /etc/cron.daily/mydailyphpwork
/usr/bin/curl http://domain.tld/path/to/cron-script.php &> /dev/null

然而,我认为你应该坚持使用TimWolla或DerVO提出的解决方案,除非你真的需要这种行为。

优点:

  • 您将按预期设置所有$ _SERVER变量。
  • 如果您需要使用if-else重写大量代码,这可能是首选,因为您不需要更改任何代码。

缺点:

  • 这是一种解决方法,可能意味着cpu负载略有增加。

答案 3 :(得分:5)

尝试使用curl运行cron作业..它将填充$ _SERVER ['HTTP_HOST']。

linux上的

语法就像

curl http://yourdomain/yourfile.php

答案 4 :(得分:2)

如果$_SERVER[HTTP_HOST]为空,您可以对其进行硬编码,或者您可以执行其他检查。

答案 5 :(得分:1)

将硬编码的args添加到crontab中并没有帮助,因为我需要它对不同的环境敏感

所以> = PHP 5.3.0你可以使用gethostname()

http://php.net/manual/en/function.gethostname.php

答案 6 :(得分:0)

令我惊讶的是,没有人提到只为另一个文件中的_SERVER数组定义任何必需值,然后仅包含它的选项。这是我发现从cli运行通常基于cgi的php脚本以进行快速测试/调试的最快方法。

例如,文件cron_server_wrapper.php

<?php
$_SERVER['SERVER_NAME'] = "localhost";
$_SERVER['HTTP_HOST'] = "localhost";
$_SERVER['REMOVE_ADDR'] = "10.20.30.40";
$_SERVER['DOCUMENT_ROOT'] = "/";
$_SERVER['HTTP_REFERER'] = "/crontab-foo";

然后运行:

/usr/bin/php -B "require 'path/to/cron_server_wrapper.php'" -E "require 'my_php_cron_script.php';" < /dev/null