【问题标题】:Crontab on AWS EC2 and $_SERVER PHP variablesAWS EC2 上的 Crontab 和 $_SERVER PHP 变量
【发布时间】:2014-02-10 07:34:57
【问题描述】:

我的服务器中有一些用于数据库维护的 PHP 脚本,需要定期执行。显然,最简单的解决方案是使用系统 cron 安排其运行。

脚本需要一些从 $_SERVER 访问的服务器变量,例如数据库主机名、cron 参数等。

我可以毫无问题地从命令行运行预定的 cron 命令,并且一切似乎都运行良好(调用类似 php filename.php 的东西)。但是,当从 cron 执行相同的命令时,脚本会失败,并且报告的错误如下:

PHP 通知:未定义索引:RDS_DATABASE 在 /var/app/current/app/xx/Db/ConnectionFactory.php 第 8 行 PHP

似乎 $_SERVER 变量在从 cron 运行时未正确初始化,但它可以从命令行运行。我试过 crontab -u ec2-user -e 但没有运气。

我不想使用 wget 来运行脚本,因为它增加了一些开销,并且脚本被隐藏,无法从 HTTP 访问。

有关从命令行成功访问 $_SERVER,但从 crontab 运行时失败的任何提示?

【问题讨论】:

  • 变量设置在哪里? _SERVER 是环境的一部分,所以我假设在您的 Apache 配置中,在这种情况下,它们对 cron 不可用。您需要将它们导出为环境变量
  • 为什么不将所需的值(即数据库端点)配置到脚本或某些配置文件中?如果您自己没有将 RDS_DATABASE 变量添加到 $_SERVER 中,为什么还要期望它出现呢?
  • 我使用 $_SERVER,因为它们可以通过 AWS Elastic Beanstalk 的控制台管理轻松配置。我在调试和发布中有不同的服务器,我想更改实例之间的最小代码。我想 _SERVER 是在 apache 中配置的。问题是为什么脚本在从命令行手动调用而不是从 cron 调用时运行?

标签: php amazon-web-services amazon-ec2 cron crontab


【解决方案1】:

有同样的问题。找到了解决方案:

echo "InstanceID: ".get_cfg_var('INSTANCE_ID')."\n";

由于某种原因,它在我的 ec2 用户上运行良好,但不能作为 root cron 作业。使用该函数而不是访问 $_SERVER 数组解决了我的问题。

【讨论】:

    【解决方案2】:

    $_SERVER 仅在您使用任何 Web 服务器运行 PHP 时才有效。如果您将使用 crontab 并通过命令行执行 PHP,它将无法正常工作。你可以参考PHP文档http://php.net/manual/en/reserved.variables.server.php#refsect1-reserved.variables.server-indices

    【讨论】:

      【解决方案3】:

      正如@Baminc 和@Ankur 所说,解决方案是使用 get_cfg_var 函数来获取信息,因为 $_SERVER 仅在您从网络浏览器访问时才有效。

      我所做的是以下例如 SERVER_NAME :

      if (isset($_SERVER['SERVER_NAME'])) {
          $myServerName = $_SERVER['SERVER_NAME'];
      } else {
          $myServerName = get_cfg_var('SERVER_NAME');
      }
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 1970-01-01
        • 2023-04-04
        • 2014-06-04
        • 1970-01-01
        • 2020-11-04
        • 2015-03-18
        • 2017-05-14
        • 2020-05-25
        相关资源
        最近更新 更多