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();
一个简单的方法是询问$argv
variables,(无论如何你可能会为命令行参数做这些)。 即使没有参数, $argv
也会返回一个空数组。
如果设置了,则使用cli。 然后你可以假设所有其他的调用是通过一些networking服务器或其他。
例如:
if (isset($argv)) { // Do the cli thing. }
我会尝试:
echo exec('whoami');
通常,networking服务器是在不同的用户名下运行的,所以应该告诉你。