我需要确定当前对PHP的调用是来自命令行(CLI)还是来自web服务器(在我的情况下,使用mod_php的Apache)。
有什么推荐方法吗?
我需要确定当前对PHP的调用是来自命令行(CLI)还是来自web服务器(在我的情况下,使用mod_php的Apache)。
有什么推荐方法吗?
当前回答
Try
isset($_SERVER['REQUEST_METHOD'])
如果设置了,则是在浏览器中。
或者,你可以检查是否
isset($_SERVER['argv'])
但在windows CLI、IDK上可能不是这样。
其他回答
我用了这个:
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';
}
我喜欢的方法是:
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);
}
一种简单的方法是查询$argv变量(您可能会对命令行参数这样做)。即使没有参数$argv也返回一个空数组。
如果设置了,则使用cli。然后,您可以假设所有其他调用都是通过某个web服务器或其他。
eg:
if (isset($argv)) {
// Do the cli thing.
}