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

有什么推荐方法吗?


当前回答

我认为他的意思是如果PHP CLI被调用,或者如果它是一个来自web请求的响应。最好的方法是使用php_sapi_name(),如果它正在运行一个web请求,它将回显Apache(如果这是它正在运行的)。

从php_sapi_name()的php文档中获取的一些列表:

aolserver apache apache2filter apache2handler caudium cgi(直到PHP 5.3) cgi-fcgi cli cli-server(自PHP 5.4起内置web服务器) 连续性 嵌入 fpm-fcgi isapi litespeed 雄鱼 nsapi phttpd pi3web roxen thttpd 晚礼服 webjames

其他回答

Php_sapi_name是您希望使用的函数,因为它返回接口类型的小写字符串。此外,还有一个PHP常量PHP_SAPI。

文档可以在这里找到:http://php.net/php_sapi_name

例如,要确定PHP是否正在从CLI运行,你可以使用这个函数:

function isCommandLineInterface()
{
    return (php_sapi_name() === 'cli');
}

我喜欢的方法是:

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

这个问题的正确答案取决于它背后的真正意图:

SAPI是决定因素吗(web-context或者不是)? 或者该信息被解释为“运行在tty中”?

如果是前者,给出的答案和写下的评论就足以找到一个有效的解决方案。

如果是后者,这里给出的食谱将失败,如果工具作为cronjob运行,或作为来自另一个守护进程的后台作业运行——在这种情况下,我建议进一步测试STDIN是否为TTY:

function at_tty() {
    return defined("\STDIN") && posix_isatty(\STDIN);
}

我用了这个:

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

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

我认为他的意思是如果PHP CLI被调用,或者如果它是一个来自web请求的响应。最好的方法是使用php_sapi_name(),如果它正在运行一个web请求,它将回显Apache(如果这是它正在运行的)。

从php_sapi_name()的php文档中获取的一些列表:

aolserver apache apache2filter apache2handler caudium cgi(直到PHP 5.3) cgi-fcgi cli cli-server(自PHP 5.4起内置web服务器) 连续性 嵌入 fpm-fcgi isapi litespeed 雄鱼 nsapi phttpd pi3web roxen thttpd 晚礼服 webjames