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

有什么推荐方法吗?


当前回答

一种简单的方法是查询$argv变量(您可能会对命令行参数这样做)。即使没有参数$argv也返回一个空数组。

如果设置了,则使用cli。然后,您可以假设所有其他调用都是通过某个web服务器或其他。

eg:

if (isset($argv)) {
  // Do the cli thing.
}

其他回答

基于银月的答案上面,我使用这个函数返回正确的换行:

/**
* 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>";

}

根据http://jp2.php.net/manual/en/features.commandline.php,只有在从CLI运行时才会设置一些常量。这些常量是STDIN, STDOUT和STDERR。测试其中一个将告诉您它是否处于cli模式

我建议检查是否设置了$_SERVER数组的一些条目。

例如:

if (isset($_SERVER['REQUEST_METHOD'])) {
        print "HTTP request\n";
} else {
        print "CLI invocation\n";
}
function is_cli() {
    return !http_response_code();
}

例子:

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

Try

isset($_SERVER['REQUEST_METHOD'])

如果设置了,则是在浏览器中。

或者,你可以检查是否

isset($_SERVER['argv'])

但在windows CLI、IDK上可能不是这样。