我需要确定当前对PHP的调用是来自命令行(CLI)还是来自web服务器(在我的情况下,使用mod_php的Apache)。
有什么推荐方法吗?
我需要确定当前对PHP的调用是来自命令行(CLI)还是来自web服务器(在我的情况下,使用mod_php的Apache)。
有什么推荐方法吗?
当前回答
Try
isset($_SERVER['REQUEST_METHOD'])
如果设置了,则是在浏览器中。
或者,你可以检查是否
isset($_SERVER['argv'])
但在windows CLI、IDK上可能不是这样。
其他回答
我建议检查是否设置了$_SERVER数组的一些条目。
例如:
if (isset($_SERVER['REQUEST_METHOD'])) {
print "HTTP request\n";
} else {
print "CLI invocation\n";
}
Php_sapi_name是您希望使用的函数,因为它返回接口类型的小写字符串。此外,还有一个PHP常量PHP_SAPI。
文档可以在这里找到:http://php.net/php_sapi_name
例如,要确定PHP是否正在从CLI运行,你可以使用这个函数:
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
基于银月的答案上面,我使用这个函数返回正确的换行:
/**
* Linebreak function
* @return "/n" if cli, else return <br>
*/
protected static function lb(){
return (defined('STDIN') || php_sapi_name() === 'cli' || isset($_ENV['SHELL']) ||
(empty($_SERVER['REMOTE_ADDR']) && !isset($_SERVER['HTTP_USER_AGENT']) && count($_SERVER['argv']) > 0) ||
!isset($_SERVER['REQUEST_METHOD'])) ? "\n" : "<br>";
}
有这么多复杂的解决方案。……怎么样?
if($_SERVER['REQUEST_SCHEME']=="http" or $_SERVER['REQUEST_SCHEME']=="https"){
// must be browser :)
}
这个问题的正确答案取决于它背后的真正意图:
SAPI是决定因素吗(web-context或者不是)? 或者该信息被解释为“运行在tty中”?
如果是前者,给出的答案和写下的评论就足以找到一个有效的解决方案。
如果是后者,这里给出的食谱将失败,如果工具作为cronjob运行,或作为来自另一个守护进程的后台作业运行——在这种情况下,我建议进一步测试STDIN是否为TTY:
function at_tty() {
return defined("\STDIN") && posix_isatty(\STDIN);
}