【问题标题】:Execute PHP via cron - No Input file specified通过 cron 执行 PHP - 未指定输入文件
【发布时间】:2009-12-04 18:28:53
【问题描述】:

我正在使用以下命令通过 cron 执行 PHP 文件

php -q /home/seilings/public_html/dvd/cron/mailer.php

问题是我有一个包含在执行中的文件,该文件确定要加载哪个配置......如下所示:

if (!strstr(getenv('HTTP_HOST'), ".com")) {
    $config["mode"] = "local";
} else {
    $config["mode"] = "live";
}

cron 正在加载 LOCAL 配置,而它应该加载 LIVE 配置。我尝试使用文件的 http:// URL 而不是绝对路径,但它没有找到该文件。我是否需要更改命令以在其中使用 URL?

【问题讨论】:

    标签: php cron


    【解决方案1】:

    另一个简单的解决方案:

    cron:

    php -q /home/seilings/public_html/dvd/cron/mailer.php local
    

    php:

    if (!empty($argv[0])) {
        $config["mode"] = "local";
    } else {
        $config["mode"] = "live";
    }
    

    【讨论】:

      【解决方案2】:

      使用此php_sapi_name() 来检查脚本是否在命令行中被调用:

      if (php_sapi_name() === 'cli' OR !strstr(getenv('HTTP_HOST'), ".com")) {
          $config["mode"] = "local";
      } else {
          $config["mode"] = "live";
      }
      

      如果您想在命令行上使用“live”,请使用以下代码:

      if (php_sapi_name() === 'cli' OR strstr(getenv('HTTP_HOST'), ".com")) {
          $config["mode"] = "live";
      } else {
          $config["mode"] = "local";
      }
      

      【讨论】:

      • 我接受它 php_sapi_name() === 'cli' 检查它是否是命令行,这意味着我需要它!=....我会测试它... ..
      • 我使用 [code]if (php_sapi_name() != 'cli' && !strstr(getenv('HTTP_HOST'), ".com")) { $config["mode"] = "当地的”; } else { $config["mode"] = "live"; }[/code] 它不起作用我需要它在通过命令行运行时实时使用
      • 在执行期间它仍然加载本地配置而不是实时配置。
      【解决方案3】:

      当您使用 cron 运行 php 时,很可能不会设置环境变量“HTTP_HOST”(或为 null),并且当为 strstr 函数提供 null 时,strstr 返回 false这就是为什么模式设置为"local"

      【讨论】:

        【解决方案4】:

        当您通过 cron 执行命令时,与命令行相比,您可能会获得一组不同的环境变量。在运行 PHP 命令之前,您可能需要编写一个包装脚本来按照您想要的方式设置环境。

        【讨论】:

          【解决方案5】:

          HTTP_HOST 等环境变量仅在您在 Web 服务器下运行 php scrints 时存在。但是您可以在 crontab 配置中手动添加它:

          ## somewhere in crontab config
          HTTP_HOST=somthing.com
          15 * * * * /path/to/your/script > /dev/null 2>&1
          

          这将使您的脚本认为它在生产环境中运行。

          【讨论】:

          • 这与所需要的相反,.com 将导致脚本在从 cron 运行时表现得就像在生产中一样
          • “cron 正在加载 LOCAL 配置,而它应该加载 LIVE 配置”——我的解决方案将解决这个问题(“live”配置将从 cron 加载)
          【解决方案6】:

          如果您感到懒惰并且不想确保所有这些环境变量都能正常工作,您可能想尝试使用 cron 运行:

          lynx -dump http://url.to.your.script > /dev/null

          【讨论】:

          • wget 比 lynx 更有意义。这不是一个懒惰的解决方案。只为 Web 访问编写代码比为 Web 访问和 cli 访问编写代码更容易维护。
          • 你是对的。我习惯了一直有猞猁。实现相同结果的 wget 参数: wget -q -O - webvuln.com > /dev/null
          猜你喜欢
          • 2014-12-12
          • 1970-01-01
          • 2013-08-31
          • 2021-11-18
          • 2015-02-12
          • 2011-02-14
          • 2015-11-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多