我需要确定当前对PHP的调用是来自命令行(CLI)还是来自web服务器(在我的情况下,使用mod_php的Apache)。
有什么推荐方法吗?
我需要确定当前对PHP的调用是来自命令行(CLI)还是来自web服务器(在我的情况下,使用mod_php的Apache)。
有什么推荐方法吗?
当前回答
根据http://jp2.php.net/manual/en/features.commandline.php,只有在从CLI运行时才会设置一些常量。这些常量是STDIN, STDOUT和STDERR。测试其中一个将告诉您它是否处于cli模式
其他回答
我认为他的意思是如果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
我已经使用这个函数好几年了
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;
}
我试一试:
echo exec('whoami');
通常网络服务器在不同的用户名下运行,所以这应该是说明问题的。
基于银月的答案上面,我使用这个函数返回正确的换行:
/**
* 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>";
}
这应该处理所有的情况(包括php-cgi)
return (php_sapi_name() === 'cli' OR defined('STDIN'));