在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脚本传递其他参数?