在PHP中检查接口类型是否为CLI


Checking if Interface Type is CLI in PHP

似乎有两种典型的方法可以确定脚本是否通过命令行运行。

  1. if ( defined('STDIN') ) # Running via CLI
  2. if (PHP_SAPI === 'cli') # Running via CLI

既然它们都被使用过,而且都是推荐的,我认为它们都很好用。我的问题是:有没有一些边缘案例会失败?哪个是首选,为什么?

我永远不会依赖if (defined('STDIN'))。因为,如果STDIN常数没有定义,我可以自己定义它:

defined('STDIN') || define('STDIN', 'random value');

它将具有以下任何代码,使用if (defined('STDIN')),相信它在命令行上运行,而PHP_SAPI始终被定义
您必须考虑的另一件事是命名空间。当然,这会影响两种检查,但您也可以使用php_sapi_name函数来确定,或者简单地说:

if ('PHP_SAPI === 'cli')

在我看来,它比更可读

if (defined('''STDIN'))

因此,基本上,使用三个选项中的任何一个,但要注意STDIN也可以是用户定义的常量。PHP_SAPIphp_sapi_name的返回值总是跨跃(AFAIK),并且您知道在运行CLI脚本时需要什么值:'cli'。不过,如果出于某种原因你不相信这一点,我见过人们这样做:

if (stristr(PHP_SAPI, 'cli') && strpos(PHP_SAPI, 'cli') === 0)

但这只是妄想症,IMHO
有些人只检查$argv,但这意味着register_argc_argv设置已启用,默认情况下是启用的,但它可以被禁用,反过来,您可以用以下内容来计数器:

#!/var/bin/php -n
<?php
    if (!is_array($argv))
    {
        exit();
    }

通过使用/path/to/php -n,您没有使用任何ini文件,因此将使用默认设置,并且由于register_argc_argv的默认设置为1,因此$argv将可用。