【问题标题】:In PHP, how to detect the execution is from CLI mode or through browser ? [duplicate]在 PHP 中,如何检测执行是从 CLI 模式还是通过浏览器? [复制]
【发布时间】:2010-12-31 18:31:12
【问题描述】:

我有一个通用脚本,它包含在我的 PHPcron 文件和通过浏览器访问的文件中。代码的某些部分,我只需要非 cron 文件。我如何检测执行是来自 CLI 还是通过浏览器(我知道可以通过使用 cron 文件传递​​一些参数来完成,但我无权访问 crontab)。有没有其他办法?

【问题讨论】:

    标签: php


    【解决方案1】:

    使用php_sapi_name() 函数。

    if (php_sapi_name() == "cli") {
        // In cli-mode
    } else {
        // Not in cli-mode
    }
    

    以下是文档中的一些相关说明:

    php_sapi_name — 返回 web 服务器和 PHP 之间的接口类型

    虽然并不详尽,但可能的返回值包括 aolserver、apache、apache2filter、apache2handler、caudium、cgi(PHP 5.3 之前)、cgi-fcgi、cli、cli-server、continuity、embed、isapi、litespeed、milter、nsapi 、phttpd、pi3web、roxen、thttpd、tux 和 webjames。

    【讨论】:

    • +1 是唯一正确的方法。
    • PHP_SAPI 也可以用于此,因此它并不是唯一正确的方法
    • 这曾经是一个仅链接的答案,直到有人复制了@Linus Unnebäck 的答案。坏习惯!否决这个,赞成另一个......
    • @GottliebNotschnabel 谢谢!看到这种情况很烦人。
    • 捏别人的帮助,啧啧啧。真的不是很厉害,伙计。
    【解决方案2】:
    if(php_sapi_name() == "cli") {
        //In cli-mode
    } else {
        //Not in cli-mode
    }
    

    【讨论】:

      【解决方案3】:

      有一个常量PHP_SAPIphp_sapi_name() 具有相同的值。

      (在 PHP >= 4.2.0 中可用)

      【讨论】:

      • 这是最好的办法!
      【解决方案4】:

      我认为您可以从 $_SERVER 变量中看到它。尝试打印出浏览器和 CLI 的 $_SERVER 数组,您应该会看到差异。

      【讨论】:

      • 这可能是真的,但可能不是确定正在使用的接口的可靠方法。检查的正确方法是使用php_sapi_name()
      【解决方案5】:

      你可以使用:

      if (isset($argc))
      {
          // CLI
      }
      else
      {
          // NOT CLI
      }
      

      【讨论】:

      • -1 - $argc 可以在应用程序中设置,不是吗?不是可靠的方法。一次花了我半天的时间。 php_sapi_name() 是我知道的唯一好方法。
      • $argv / $argc 也可以在某些配置中填充 GET 变量!
      • $argc 可以在设置中禁用(未注册),即使是控制台应用程序
      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 2019-03-11
      • 2012-07-26
      • 2013-09-08
      • 2019-09-05
      • 1970-01-01
      • 2018-01-10
      • 2023-03-07
      相关资源
      最近更新 更多