我需要确定当前对PHP的调用是来自命令行(CLI)还是来自web服务器(在我的情况下,使用mod_php的Apache)。

有什么推荐方法吗?


当前回答

我用了这个:

php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)

这是来自Drush代码库,环境。公司也有类似的检查。

其他回答

我喜欢的方法是:

if (array_key_exists('SHELL', $_ENV)) {
  echo "Console invocation";
}
else {
  echo "HTTP invocation";
}

我用了这个:

php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)

这是来自Drush代码库,环境。公司也有类似的检查。

function is_cli() {
    return !http_response_code();
}

例子:

if (is_cli()) {
    echo 'command line';
} else {
    echo 'browser';
}

php_sapi_name() is really not the best way to perform this check because it depends on checking against many possible values. The php-cgi binary can be called from the command line, from a shell script or as a cron job and (in most cases) these should also be treated as 'cli' but php_sapi_name() will return different values for these (note that this isn't the case with the plain version of PHP but you want your code to work anywhere, right?). Not to mention that next year there may be new ways to use PHP that we can't possibly know now. I'd rather not think about it when all I care about is weather I should wrap my output in HTML or not.

幸运的是,PHP有一种方法可以检查这一点。只需使用http_response_code(),不带任何参数,如果从web服务器类型环境运行,它将返回TRUE,如果从CLI类型环境运行,则返回FALSE。代码如下:

$is_web=http_response_code()!==FALSE;

即使您在调用之前不小心(?)从从CLI(或类似CLI的东西)运行的脚本设置了响应代码,这也可以工作。

有这么多复杂的解决方案。……怎么样?

if($_SERVER['REQUEST_SCHEME']=="http" or $_SERVER['REQUEST_SCHEME']=="https"){
    // must be browser :)
}