PHP Conference Japan 2024

php_sapi_name

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

php_sapi_name返回 Web 服务器和 PHP 之间的接口类型

描述

php_sapi_name(): string|false

返回一个描述 PHP 使用的接口类型(服务器 API,SAPI)的小写字符串。例如,在 CLI PHP 中,此字符串将为“cli”,而在 Apache 中,它可能根据使用的确切 SAPI 具有多个不同的值。可能的返回值列在下面。

参数

此函数没有参数。

返回值

返回接口类型,作为小写字符串,或在失败时返回false

虽然不详尽,但可能的返回值包括 apacheapache2handlercgi(直到 PHP 5.3)、cgi-fcgiclicli-serverembedfpm-fcgilitespeedphpdbg

示例

示例 #1 php_sapi_name() 示例

此示例检查子字符串 cgi,因为它也可能是 cgi-fcgi

<?php
$sapi_type
= php_sapi_name();
if (
substr($sapi_type, 0, 3) == 'cgi') {
echo
"您正在使用 CGI PHP\n";
} else {
echo
"您没有使用 CGI PHP\n";
}
?>

注释

注意另一种方法

PHP 常量PHP_SAPIphp_sapi_name() 的值相同。

提示

一个潜在的陷阱

定义的 SAPI 可能并不明显,因为例如它可能定义为 apache2handler,而不是 apache

参见

添加注释

用户贡献的注释 3 条注释

43
michal at roszka dot pl
15 年前
php_sapi_name() 函数在您想要确定接口类型时非常有用。但是,在设计应用程序或将其部署到未知服务器时,您需要注意另一个陷阱。

每当某些内容依赖于接口类型时,请确保您的检查是确定性的。特别是当您想区分命令行接口 (CLI) 和通用网关接口 (CGI) 时。

请注意,php-cgi 二进制文件也可以从命令行、shell 脚本或 cron 作业中调用!如果是这样,php_sapi_name() 将始终返回相同的值(即“cgi-fcgi”),而不是您期望的“cli”。

坏事发生在好人身上。不要总是期望 /usr/bin/php 是指向 php-cli 二进制文件的链接。

幸运的是,$_SERVER 和 $_ENV 超全局数组的内容取决于 php-cgi 二进制文件是从命令行接口(由 shell 脚本、cron 等)调用还是由某些 HTTP 服务器(例如 lighttpd)调用。

<?php
var_dump
($_SERVER);
?>

尝试从命令行接口和通过 HTTP 请求调用 php-cgi 二进制文件,并比较上述脚本的输出。会有很多选项可以满足几乎所有人的需求。

为了安全起见,请记住,$_SERVER 和 $_ENV 超全局数组(以及 $_GET、$_POST、$_COOKIE、$_FILES 和 $_REQUEST)的内容应被视为受污染的。
30
hajo-p
10 年前
一些尚未提到的 sapi 名称

cli-server -> php 内置 Web 服务器
srv -> hhvm
0
匿名用户
1 年前
注意:在使用带有 CPanel 的 Litespeed 时,SAPI 将为“litespeed”,而不是包含“cgi”。
To Top