我需要确定当前的PHP调用是从命令行(CLI)还是从Web服务器(在我的情况下,是使用mod_php的Apache)。
有什么推荐的方法吗?
我需要确定当前的PHP调用是从命令行(CLI)还是从Web服务器(在我的情况下,是使用mod_php的Apache)。
有什么推荐的方法吗?
Answers:
php_sapi_name
是您要使用的函数,因为它返回接口类型的小写字符串。另外,还有PHP常量PHP_SAPI
。
可以在这里找到文档:http : //php.net/php_sapi_name
例如,要确定是否正在从CLI运行PHP,可以使用以下函数:
function isCommandLineInterface()
{
return (php_sapi_name() === 'cli');
}
return php_sapi_name() == 'cli';
php-cgi
以此调用脚本,将无法正常工作。反过来,它将返回cgi-fcgi
String。如果从浏览器将脚本加载为网页,则会得到apache2handler
。希望这可以帮助。我需要使用php-cgi
来引入$_GET
变量:php-cgi myscript.php arg1=one arg2=two
。测试不等于apache2handler
应该可以apache
。
"cli"
。从内部有许多od differents键可供选择,$_SERVER
以更可靠地确定请求是否通过HTTP发出。
我已经使用此功能几年了
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;
}
array_key_exists('REQUEST_METHOD', $_SERVER) return true;
WAT?
array_key_exists('REQUEST_METHOD', $_SERVER)
是否正确,以帮助检测请求的来源。在CLI中,$_SERVER
Super Global数组将“ 不具有键” REQUEST_METHOD
,只有在通过Web发出请求时,它才存在,因此,在检查该请求时,作者绝对是目标。
return false;
或做if ( ! array_key_exists(…)) return true;
?
'REQUEST_METHOD'
是不是找到,则函数应该返回FALSE
指示“CLI”。我很抱歉没有注意函数本身的范围...作者应该修复它,因为函数实际上起作用了!
php_sapi_name()
确实不是执行此检查的最佳方法,因为它取决于检查许多可能的值。可以从命令行,shell脚本或cron作业中调用php-cgi二进制文件,并且(在大多数情况下)这些也应被视为“ cli”,但它们php_sapi_name()
将返回不同的值(请注意,这是“普通版本的PHP就是这种情况,但是您希望代码可以在任何地方工作,对吗?)。更不用说明年可能会有我们现在可能不知道的使用PHP的新方法。当我只关心天气时,我宁愿不考虑它,而应该将输出包装为HTML。
幸运的是,PHP有一种方法可以对此进行专门检查。只需http_response_code()
不带任何参数使用,如果从Web服务器类型环境运行,它将返回TRUE,而从CLI类型环境运行,则返回FALSE。这是代码:
$is_web=http_response_code()!==FALSE;
如果您在调用此函数之前意外地(?)设置了从CLI(或类似CLI)运行的脚本的响应代码,这甚至可以工作。
http_response_code()
从CLI运行时设置代码/返回设置代码。已通过验证<?php function t() { echo var_export(http_response_code(), true) . ' -> ' . (http_response_code() !== false ? 'web' : 'cli') . "\n"; } t(); http_response_code(200); t(); http_response_code(false); t();
。因此,如果http_response_code()===false
确定采用CLI,那是安全的选择,但是如果没有,您还需要检查其他指标。
我认为他的意思是正在调用PHP CLI还是来自Web请求的响应。最好的方法是使用php_sapi_name()
一个正在运行的请求,如果它正在运行一个Web请求,它将回显Apache。
列出以下摘自php 文档的php_sapi_name()
列表:
function is_cli() {
return !http_response_code();
}
例:
if (is_cli()) {
echo 'command line';
} else {
echo 'browser';
}
http_response_code(200);
……如果我现在调用http_response_code()
它,它将返回200;
http_response_code();
从CLI环境中调用,则无论实际状态代码如何,它将始终返回FALSE。我已经在回答中对此进行了解释,但是您也可以通过阅读“返回值”下的手册页或尝试一下来找到答案。
php -r 'http_response_code(200); echo http_response_code()."\n";'
输出“ 200”,除非您可以保证某些库或无知框架未设置响应代码http_response_code
(即使在cli env中),也可以使用。我个人使用$isCli = \defined('STDIN') || isset($_SERVER['argv']) || \array_key_exists('REQUEST_METHOD', $_SERVER)
根据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";
}
php-cgi
命令行,它将设置GET
为:php-cgi -f file.php arg1=2
// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));
if(IS_CLI_CALL){
//do you stuff here
}
基于上述Silver Moon的答案,我正在使用此函数返回正确的换行符:
/**
* 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>";
}