似乎有两种典型的方法可以确定脚本是否通过命令行运行。
if ( defined('STDIN') ) # Running via CLI
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_SAPI
或php_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
将可用。