我有一个PHP脚本,需要确定它是否是这样做的规范方式?我原以为是要检查 SERVER['argc'] ,但事实证明这是填充的,即使使用'Apache 2.0 Handler'服务器API也是如此 .
SERVER['argc']
使用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 ,嵌入,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版本是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 recommends使用 PHP_SAPI === 'cli'
PHP_SAPI === 'cli'
我认为
$_SERVER['REMOTE_ADDR']
将不会从CLI填充 .
此外,$ SERVER超全局中的所有HTTP *键都不会从CLI填充,或者以刚才提到的正确方式执行:-)
php_sapi _name的文档页面清楚地说明了它的工作原理:
php_sapi
返回一个小写字符串,描述PHP正在使用的接口类型(Server API,SAPI)....虽然不是详尽无遗,但可能的返回值包括aolserver,apache,apache2filter,apache2handler,caudium,cgi(直到PHP 5.3) ),cgi-fcgi,cli,continuity,embed,isapi,litespeed,milter,nsapi,phttpd,pi3web,roxen,thttpd,tux和webjames .
我不确定为什么hop不认为PHP适合严肃的程序员(我是一个认真的程序员,我每天都使用PHP),但如果他想帮助澄清文档,那么也许他可以审核所有可能的Web服务器PHP可以运行并确定每个服务器的所有可能接口类型的名称 . 只需确保在添加新的Web服务器和接口时更新该列表 .
还有,鲍比说:
我很感兴趣为什么这个文件 . 示例检查前3个字符,而描述说明字符串应该是“CGI”
该示例的说明指出:
此示例检查子字符串cgi,因为它也可能是cgi-fcgi .
5 回答
使用php_sapi_name()功能 .
以下是文档中的一些相关说明:
在PHP> = 4.2.0中,还有一个预定义的常量
PHP_SAPI
,其值与php_sapi_name()
相同 .这将始终有效 . (如果PHP版本是4.2.0或更高版本)
这使您可以轻松地在脚本的顶部使用:
这是Drupal 7的实现:drupal_is_cli():
但Drupal 8 recommends使用
PHP_SAPI === 'cli'
我认为
将不会从CLI填充 .
此外,$ SERVER超全局中的所有HTTP *键都不会从CLI填充,或者以刚才提到的正确方式执行:-)
php_sapi
_name的文档页面清楚地说明了它的工作原理:我不确定为什么hop不认为PHP适合严肃的程序员(我是一个认真的程序员,我每天都使用PHP),但如果他想帮助澄清文档,那么也许他可以审核所有可能的Web服务器PHP可以运行并确定每个服务器的所有可能接口类型的名称 . 只需确保在添加新的Web服务器和接口时更新该列表 .
还有,鲍比说:
该示例的说明指出: