Answers:
使用php_sapi_name()
功能。
if (php_sapi_name() == "cli") {
// In cli-mode
} else {
// Not in cli-mode
}
以下是文档中的一些相关说明:
php_sapi_name —返回Web服务器和PHP之间的接口类型
尽管不完整,但可能的返回值包括aolserver,apache,apache2filter,apache2handler,caudium,cgi(直到PHP 5.3),cgi-fcgi,cli,cli-server,continuity,embed,isapi,litespeed,milter,nsapi,phttpd, pi3web,roxen,thttpd,tux和webjames。
在PHP> = 4.2.0中,还有一个预定义的常量,PHP_SAPI
其值与相同php_sapi_name()
。
这将始终有效。(如果PHP版本是4.2.0或更高版本)
define('CLI', PHP_SAPI === 'cli');
这使得在脚本顶部易于使用:
<?php PHP_SAPI === 'cli' or die('not allowed');
CLI or die('not allowed');
CLI or die('not allowed');
是完美的。
Which makes it easy to use at the top of your scripts
听起来并不像是两个单独的用途。是的,我是个死灵法师。
这是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'
我认为
$_SERVER['REMOTE_ADDR']
不会从CLI填充。
同样,不会从CLI填充$ _SERVER超全局变量中的所有HTTP_ *键,也不会以刚才提到的正确方式进行操作:-)
php_sapi
_name 的文档页面清楚地说明了它的工作方式:
返回一个小写的字符串,该字符串描述PHP正在使用的接口类型(服务器API,SAPI)。
尽管并不详尽,但可能的返回值包括aolserver,apache,apache2filter,apache2handler,caudium,cgi(直到PHP 5.3),cgi-fcgi,cli,连续性,嵌入,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen, thttpd,tux和webjames。
我不确定为什么Hop不认为PHP适用于认真的程序员(我是认真的程序员,并且我每天都使用PHP),但是如果他想帮助澄清文档,那么也许他可以审核所有可能的Web服务器PHP可以在其上运行并确定每个服务器的所有可能接口类型的名称。只要确保在添加新的Web服务器和界面时使该列表保持更新即可。
此外,鲍比说:
我对为什么选择该文档很感兴趣。该示例检查了前3个字符,而说明指出该字符串应恰好是“ CGI”
该示例的说明指出:
本示例检查子字符串cgi,因为它也可能是cgi-fcgi。