【问题标题】:Cron Job $_SERVER issueCron 作业 $_SERVER 问题
【发布时间】:2012-02-26 01:28:17
【问题描述】:

我想运行一个 cron 作业。我的应用是用 PHP 和 Mysql 开发的。

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

任何机构都可以提出解决此问题的建议吗?

【问题讨论】:

  • 请提供一些错误信息。可能 $_SERVER['HTTP_HOST'] undefined 由于 cron 脚本没有定义任何 HTTP_HOST,就像浏览器一样?您可以使用 isset($_SERVER['HTTP_HOST']) 对其进行测试
  • php >= 5.3.0 使用 gethostname()
  • @nick 如果网站托管在共享主机上,gethostname() 会返回服务器的主机,例如 s1.myhosting.com

标签: php cron


【解决方案1】:

$_SERVER['HTTP_HOST'] 从 cronjob 运行时未填充,文件未通过 HTTP 访问。

您要么必须对主机进行硬编码,要么通过命令行参数传递它并通过$_SERVER['argv'] 数组访问它。

【讨论】:

  • 好答案。 CLI 脚本具有您可以访问的 $argv 和 $argc 全局变量,因此无需使用 $_SERVER。
  • $argv 在没有全局关键字的函数中不可用。 $_SERVER 是超全球性的。
【解决方案2】:

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

您可以使用 @ 符号来抑制错误,或者使用构造行更加谨慎:

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

【讨论】:

    【解决方案3】:

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

    linux 上的语法是这样的

    curl http://yourdomain/yourfile.php
    

    【讨论】:

    • 这是我心目中最直接的解决方案,只要您的文件位于面向公众的 URL 上。 AronCederholm 也提出了类似的建议,但支持@alwaysLearn 直截了当地回答。这对我来说很完美。
    • 小心使用它 - 通常对于 cron 作业,您希望在特定时间运行它们。将它们放在这样的公共域中,任何人都可以随时运行您的工作,只需访问 URL。
    【解决方案4】:

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

    不过,有一个选项可以在 php-cgi 中运行您的 cron 脚本,在那里您将拥有 $_SERVER。如果您 curl 到本地 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 负载略有增加。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 它给了我“网络”:(
      【解决方案6】:

      如果$_SERVER[HTTP_HOST] 为空,您可以硬编码它的值,或者您可以执行一些其他检查。

      【讨论】:

        【解决方案7】:

        我很惊讶没有人提到在另一个文件中为 _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
        

        【讨论】:

          猜你喜欢
          • 2016-09-14
          • 2012-08-01
          • 2011-08-18
          • 2023-03-08
          • 2015-08-19
          • 2021-08-12
          • 2012-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多