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

有什么推荐方法吗?


当前回答

我已经使用这个函数好几年了

function is_cli()
{
    if ( defined('STDIN') )
    {
        return true;
    }

    if ( php_sapi_name() === 'cli' )
    {
        return true;
    }

    if ( array_key_exists('SHELL', $_ENV) ) {
        return true;
    }

    if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0) 
    {
        return true;
    } 

    if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
    {
        return true;
    }

    return false;
}

其他回答

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

例如:

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

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

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

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

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

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

Try

isset($_SERVER['REQUEST_METHOD'])

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

或者,你可以检查是否

isset($_SERVER['argv'])

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

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

例子:

if (is_cli()) {
    echo 'command line';
} else {
    echo 'browser';
}
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));

if(IS_CLI_CALL){
   //do you stuff here

}