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

在PHP中检查接口类型是否为CLI,php,command-line-interface,Php,Command Line Interface,看起来有两种典型的方法可以确定脚本是否通过命令行运行 if(已定义('STDIN')#通过CLI运行 if(PHP_SAPI==“cli”)#通过cli运行 因为它们都被使用过,也被推荐过,所以我认为它们都很好用。我的问题是:是否有一些附带的情况会导致失败?哪个是首选,为什么?如果(定义('STDIN'))我永远不会依赖。原因很简单,如果未定义STDIN常量,我可以自己定义它: defined('STDIN') || define('STDIN', 'random value'); 如果使用i

看起来有两种典型的方法可以确定脚本是否通过命令行运行

  • if(已定义('STDIN')#通过CLI运行
  • if(PHP_SAPI==“cli”)#通过cli运行

  • 因为它们都被使用过,也被推荐过,所以我认为它们都很好用。我的问题是:是否有一些附带的情况会导致失败?哪个是首选,为什么?

    如果(定义('STDIN'))我永远不会依赖
    。原因很简单,如果未定义
    STDIN
    常量,我可以自己定义它:

    defined('STDIN') || define('STDIN', 'random value');
    
    如果使用
    if(defined('STDIN'))
    相信它正在命令行上运行,那么它将具有以下任意代码,而
    PHP\u SAPI
    将始终被定义。
    您必须考虑的另一件事是名称空间。当然,这会影响两种检查,但您也可以使用以确保,或者简单地:

    if (\PHP_SAPI === 'cli')
    
    在我看来,这比:

    if (defined('\\STDIN'))
    
    因此,基本上可以使用这三个选项中的任何一个,但要注意,
    STDIN
    也可以是用户定义的常量
    PHP\u SAPI
    PHP\u SAPI\u name
    的返回值始终是astring(AFAIK),您知道在运行CLI脚本时需要什么值:
    'CLI'
    。但是,如果出于某种原因你不相信,我见过人们这样做:

    if (stristr(PHP_SAPI, 'cli') && strpos(PHP_SAPI, 'cli') === 0)
    
    但那只是偏执,伊姆霍。
    有些只是检查
    $argv
    ,但这意味着启用了
    register\u argc\u argv
    设置,这在默认情况下是启用的,但反过来,您可以使用类似以下内容的计数器:

    #!/var/bin/php -n
    <?php
        if (!is_array($argv))
        {
            exit();
        }
    
    #/var/bin/php-n
    
    如果(defined('STDIN'))
    我永远不会依赖
    。原因很简单,如果未定义
    STDIN
    常量,我可以自己定义它:

    defined('STDIN') || define('STDIN', 'random value');
    
    如果使用
    if(defined('STDIN'))
    相信它正在命令行上运行,那么它将具有以下任意代码,而
    PHP\u SAPI
    将始终被定义。
    您必须考虑的另一件事是名称空间。当然,这会影响两种检查,但您也可以使用以确保,或者简单地:

    if (\PHP_SAPI === 'cli')
    
    在我看来,这比:

    if (defined('\\STDIN'))
    
    因此,基本上可以使用这三个选项中的任何一个,但要注意,
    STDIN
    也可以是用户定义的常量
    PHP\u SAPI
    PHP\u SAPI\u name
    的返回值始终是astring(AFAIK),您知道在运行CLI脚本时需要什么值:
    'CLI'
    。但是,如果出于某种原因你不相信,我见过人们这样做:

    if (stristr(PHP_SAPI, 'cli') && strpos(PHP_SAPI, 'cli') === 0)
    
    但那只是偏执,伊姆霍。
    有些只是检查
    $argv
    ,但这意味着启用了
    register\u argc\u argv
    设置,这在默认情况下是启用的,但反过来,您可以使用类似以下内容的计数器:

    #!/var/bin/php -n
    <?php
        if (!is_array($argv))
        {
            exit();
        }
    
    #/var/bin/php-n
    
    我认为这很有趣,IMO#2更为明确——它精确地检查您要查找的内容;但我总是使用选项2,从来没有让我失望过,尽管有一些潜在的“边缘”值,比如
    embed
    returned@markBaker:
    $argv
    可以使用
    寄存器\u argc\u argv=0禁用。在我看来,最好使用
    PHP_-SAPI
    …@Elias-从未尝试过在CLI PHP.ini中禁用argc_-argv,它是否真的禁用了它,如果禁用了CLI脚本,有没有其他方法可以将附加参数传递给它?我认为这很有趣IMO#2更明确-它正在检查您要查找的内容。或者,测试$argv:如果在cli中运行,那么它将是一个至少有一个条目(php脚本名称)的数组;但我总是使用选项2,从来没有让我失望过,尽管有一些潜在的“边缘”值,比如
    embed
    returned@markBaker:
    $argv
    可以使用
    寄存器\u argc\u argv=0禁用。在我看来,最好使用
    PHP_-SAPI
    ..@Elias-从未尝试过在CLI PHP.ini中禁用argc_-argv,它是否真的禁用了它,如果禁用了它,您有没有办法向CLI脚本传递其他参数?