我有一个 PHP 脚本,它需要确定是通过命令行执行还是通过 HTTP 执行,主要是为了输出格式化的目的。这样做的规范方式是什么?我原以为它是用来检查 SERVER['argc']的,但实际上它是填充的,即使在使用“ Apache 2.0 Handler”服务器 API 时也是如此。
SERVER['argc']
我觉得
$_SERVER['REMOTE_ADDR']
将不会从 CLI 中填充。
此外,$_ SERVER superglobal 中的所有 HTTP _ * 键不会从 CLI 中填充,或者按照刚才提到的跳转方式进行填充: -)
使用 php_sapi_name()函数。
php_sapi_name()
if (php_sapi_name() == "cli") { // In cli-mode } else { // Not in cli-mode }
以下是一些文件中的相关注释:
返回 web 服务器和 PHP 之间的接口类型 虽然不是详尽的,但可能的返回值包括 aolserver,apache,apache2filter,apache2handler,caudum,cgi (直到 PHP 5.3) ,cgi-fcgi,cli,cli-server,连续性,embed,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen,thttpd,tux 和 webjames。
返回 web 服务器和 PHP 之间的接口类型
虽然不是详尽的,但可能的返回值包括 aolserver,apache,apache2filter,apache2handler,caudum,cgi (直到 PHP 5.3) ,cgi-fcgi,cli,cli-server,连续性,embed,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen,thttpd,tux 和 webjames。
在 PHP > = 4.2.0中,还有一个预定义的常量 PHP_SAPI,它的值与 php_sapi_name()相同。
PHP_SAPI
php_sapi _ name 的文档页面清楚地说明了它的工作原理:
php_sapi
返回一个小写字符串,该字符串描述 PHP 正在使用的接口类型(Server API、 SAPI) ..。 虽然不是详尽的,但可能的返回值包括 aolserver,apache,apache2filter,apache2handler,caudum,cgi (直到 PHP 5.3) ,cgi-fcgi,cli,连续性,嵌入,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen,thttpd,tux 和 webjames。
返回一个小写字符串,该字符串描述 PHP 正在使用的接口类型(Server API、 SAPI) ..。
虽然不是详尽的,但可能的返回值包括 aolserver,apache,apache2filter,apache2handler,caudum,cgi (直到 PHP 5.3) ,cgi-fcgi,cli,连续性,嵌入,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen,thttpd,tux 和 webjames。
我不知道为什么 Hop 不认为 PHP 适合严肃的程序员(我是一个严肃的程序员,我每天使用 PHP) ,但如果他想帮助澄清文档,那么也许他可以审计所有可能的网络服务器,PHP 可以运行,并确定每个服务器的所有可能的接口类型的名称。只要确保在添加新的 Web 服务器和接口时更新该列表即可。
还有,鲍比说:
我很好奇为什么医生。示例检查前3个字符,而描述指出字符串应该正好是“ CGI”
该示例的说明指出:
此示例检查子字符串 cgi,因为它也可能是 cgi-fcgi。
这将始终工作。(如果 PHP 版本是4.2.0或更高)
define('CLI', PHP_SAPI === 'cli');
这使得它很容易在脚本的顶部使用:
<?php PHP_SAPI === 'cli' or die('not allowed');
下面是 Drupal 7的实现: Drupal _ is _ cli ():
function drupal_is_cli() { return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0))); }
然而 Drupal 8 建议使用 PHP_SAPI === 'cli'
PHP_SAPI === 'cli'