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(): 字串|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_SAPI 的值與 php_sapi_name() 相同。

提示

一個潛在的陷阱

定義的 SAPI 可能不明顯,例如,它可能被定義為 apache2handler 而不是 apache

另請參閱

新增註釋

使用者貢獻的註釋 3 則註釋

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)的內容應被視為受污染的。
hajo-p
10 年前
一些尚未提及的 sapi 名稱

cli-server -> php 內建網路伺服器
srv -> hhvm
匿名
1 年前
注意:當在 cPanel 中使用 LiteSpeed 時,SAPI 將會是「litespeed」而不是包含「cgi」。
To Top