PHP – 如何最好地确定当前的调用是从CLI还是Web服务器?

我需要确定当前的PHP调用是从命令行(CLI)还是从Web服务器(在我的情况下,Apache与mod_php)。

任何推荐的方法?

php_sapi_name是您将要使用的函数,因为它返回接口types的小写string。 另外,还有PHP常量PHP_SAPI

文档可以在这里find: http : //php.net/php_sapi_name

例如,要确定是否从CLI运行PHP,可以使用以下函数:

 function isCommandLineInterface() { return (php_sapi_name() === 'cli'); } 

我认为他意味着如果PHP CLI被调用,或者如果它是来自Web请求的响应。 最好的方法是使用php_sapi_name() ,如果运行的是web请求,则会响应Apache。

php_sapi_name()的php 文档中php_sapi_name()一些列表:

  • AOLserver的
  • 阿帕奇
  • 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

这应该处理所有的情况(包括php-cgi)

 return (php_sapi_name() === 'cli' OR defined('STDIN')); 

我已经使用这个function了几年

 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; } 

让我知道你的想法

php_sapi_name()实际上不是执行此检查的最佳方法,因为它取决于检查许多可能的值。 php-cgi二进制文件可以从命令行,shell脚本或cron作业调用,并且(大多数情况下)也应该被视为“cli”,但是php_sapi_name()会返回不同的值这不是简单的PHP版本的情况,但你希望你的代码在任何地方工作,对不对?)。 更何况,明年可能会有新的方法来使用PHP,我们现在不可能知道。 当我所关心的是天气,我不应该考虑它,我会包装我的输出在HTML或不。

幸运的是,PHP有一个专门检查这个的方法。 只需使用没有任何参数的http_response_code() ,如果从Web服务器types环境运行,它将返回TRUE;如果从CLItypes环境运行,则返回FALSE。 这里是代码:

 $is_web=http_response_code()!==FALSE; 

如果您在调用此命令之前意外地(?)从CLI中运行的脚本(或类似CLI的脚本)设置了响应代码,这甚至会起作用。

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

例:

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

尝试

 isset($_SERVER['REQUEST_METHOD']) 

如果已设置,则表示您在浏览器中。

或者,你可以检查是否

 isset($_SERVER['argv']) 

但在Windows CLI,IDK上可能不是这样。

我用这个:

 php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0) 

这是来自Drush codebase,environment.inc,他们有类似的检查。

根据http://jp2.php.net/manual/en/features.commandline.php只有从CLI运行时才会设置一些常量。; 这些常量是STDIN,STDOUT和STDERR。 testing其中的一个会告诉你,如果它是在cli模式

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

例如:

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

我的首选方法:

 if (array_key_exists('SHELL', $_ENV)) { echo "Console invocation"; } else { echo "HTTP invocation"; } 
 // Detect CLI calls define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 )); if(IS_CLI_CALL){ //do you stuff here } 

joomla的方式

 if (array_key_exists('REQUEST_METHOD', $_SERVER)) die(); 

一个简单的方法是询问$argvvariables,(无论如何你可能会为命令行参数做这些)。 即使没有参数, $argv也会返回一个空数组。

如果设置了,则使用cli。 然后你可以假设所有其他的调用是通过一些networking服务器或其他。

例如:

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

我会尝试:

 echo exec('whoami'); 

通常,networking服务器是在不同的用户名下运行的,所以应该告诉你。