代码之家  ›  专栏  ›  技术社区  ›  Bobby Jack

确定命令行与PHP脚本HTTP执行的规范方法是什么?

  •  149
  • Bobby Jack  · 技术社区  · 16 年前

    我有一个PHP脚本,需要确定它是通过命令行还是通过HTTP执行的,主要是为了输出格式化。做这件事的标准方法是什么?我以为是检查 SERVER['argc'] 但事实证明,即使在使用“apache 2.0处理程序”服务器API时,也会填充此内容。

    5 回复  |  直到 8 年前
        1
  •  210
  •   Andy Fleming    10 年前

    使用 php_sapi_name() 功能。

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

    以下是文档中的一些相关注释:

    山羊齿 返回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。

    在php>=4.2.0中,还有一个预定义的常量, PHP_SAPI ,其值与 PHPSAPIIAN() .

        2
  •  21
  •   Xeoncross    12 年前

    这将一直有效。(如果PHP版本为4.2.0或更高版本)

    define('CLI', PHP_SAPI === 'cli');
    

    这使得在脚本顶部很容易使用:

    <?php PHP_SAPI === 'cli' or die('not allowed');
    
        3
  •  9
  •   ya.teck    8 年前

    以下是Drupal 7的实现: drupal_is_cli() :

    function drupal_is_cli() {
      return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
    }
    

    然而Drupal 8 recommends 使用 PHP_SAPI === 'cli'

        4
  •  8
  •   Vinko Vrsalovic    16 年前

    我想

    $_SERVER['REMOTE_ADDR']
    

    不会从CLI填充。

    另外,$u server superglobal中的所有http_*keys都不会从cli中填充,也不会按刚才提到的正确方式执行hop:-)

        5
  •  4
  •   A J    9 年前

    的文档页 php_sapi _名字清楚地说明了它是如何工作的:

    返回一个小写字符串,描述PHP正在使用的接口类型(服务器API、SAPI…)。

    尽管并非详尽,但可能的返回值包括AOLServer、Apache、Apache2Filter、Apache2Handler、Caudium、CGI(直到php 5.3)、CGI fcgi、cli、continuity、embed、isapi、litestspeed、milter、nsapi、phttpd、pi3web、roxen、thttpd、tux和webjames。

    我不知道为什么hop不认为php适合严肃的程序员(我是严肃的程序员,每天都使用php),但是如果他想帮助澄清文档,那么他也许可以审计php可以运行的所有可能的Web服务器,并确定每个服务器的所有可能的接口类型的名称。只要确保在添加新的Web服务器和接口时更新该列表。

    博比还说:

    我很好奇为什么要去看医生。示例检查前3个字符,而描述说明字符串应为“cgi”。

    示例说明如下:

    此示例检查子字符串CGI,因为它也可能是CGI FCGI。