與 eng.mrkto.com 所說的相反,getenv() 並非總是區分大小寫。在 Linux 上不是
<?php
var_dump(getenv('path')); // bool(false)
var_dump(getenv('Path')); // bool(false)
var_dump(getenv('PATH')); // string(13) "/usr/bin:/bin"
(PHP 4, PHP 5, PHP 7, PHP 8)
getenv — 取得單一或所有環境變數的值
取得單一或所有環境變數的值。
您可以使用 phpinfo() 來查看所有環境變數的清單。許多這些變數都列在 » RFC 3875 中,特別是第 4.1 節「Request Meta-Variables」。
版本 | 描述 |
---|---|
8.0.0 | name 現在可為 null。 |
7.1.0 | 現在可以省略 name 以擷取所有環境變數的關聯 array。 |
7.0.9 | 已加入 local_only 參數。 |
範例 #1 getenv() 範例
<?php
// getenv() 的範例用法
$ip = getenv('REMOTE_ADDR');
// 或者直接使用 Superglobal ($_SERVER 或 $_ENV)
$ip = $_SERVER['REMOTE_ADDR'];
// 安全地取得環境變數的值,忽略是否由 SAPI 設定
// 或是否已使用 putenv 變更
$ip = getenv('REMOTE_ADDR', true) ?: getenv('REMOTE_ADDR')
?>
如果 PHP 在 Fast CGI 等 SAPI 中執行,此函數將始終傳回由 SAPI 設定的環境變數的值,即使已使用 putenv() 設定了相同名稱的本機環境變數。使用 local_only
參數傳回本機設定的環境變數的值。
與 eng.mrkto.com 所說的相反,getenv() 並非總是區分大小寫。在 Linux 上不是
<?php
var_dump(getenv('path')); // bool(false)
var_dump(getenv('Path')); // bool(false)
var_dump(getenv('PATH')); // string(13) "/usr/bin:/bin"
如 httpoxy.org 所述,getenv() 會讓您誤以為所有變數都來自「安全」的環境(並非所有都是)。
特別是,$_SERVER['HTTP_PROXY'](或其等效的 getenv('HTTP_PROXY'))可以在 HTTP 要求標頭中手動設定,因此在 CGI 環境中不應被視為安全。
簡而言之,請盡量避免使用 getenv('HTTP_PROXY') 而不進行適當的過濾。
此函數很有用(與 $_SERVER、$_ENV 相比),因為它會以不區分大小寫的方式在這些陣列中搜尋 $varname 鍵。
例如在 Windows 上 $_SERVER['Path'] 看起來就像您看到的大寫,而不是您預期的 'PATH'。
所以只要:<?php getenv('path') ?>
我做了一個關於環境的基準測試。
常數
0.00067687034606934 毫秒
getenv
0.056761026382446 毫秒
(越少越好)
https://github.com/eftec/php-benchmarks#define--const--env
而且,至少在 Windows 上,讀取環境值相當慢(與常數相比),因此 PHP 不會快取資訊,而是每次呼叫都向作業系統請求環境值。
因此,如果您每個請求呼叫一次,則沒有問題。但是,如果您每個請求呼叫多次,則可能會影響效能。
到目前為止,所有的註解和範例都嚴格地屬於 CGI。
不應低估 getenv()/putenv() 在 CLI 中的實用性。
您可以使用環境變數將多個變數傳遞到 CLI 腳本,無論是在 Unix/Linux bash/sh 中使用 "VAR='foo'; export $VAR" 模式,還是在 Windows 中使用 "set VAR='foo'" 模式。(Csh 使用者,您們自己想辦法!)getenv("VAR") 將會從環境中擷取該值。
我們有一個系統,藉由包含一個充滿 `putenv()` 陳述式的檔案來儲存設定值,這些設定值可以應用於許多不同的 CLI PHP 程式。但如果我們想要覆寫這些值,可以使用 shell(或調用應用程式,例如 Ant)的環境變數設定方法來達成。
這讓我們不必管理透過命令列參數進行的難以管理的一次性設定變更;取而代之,我們只需先設定適當的環境變數即可。
如您所知,`getenv('DOCUMENT_ROOT')` 很有用。
然而,在 CLI 環境下(我傾向於快速檢查
它是否運作),如果不修改 php.ini 檔案,它就無法運作。
所以我將 `"export DOCUMENT_ROOT=~"` 加入我的 `.bash_profile` 中。
為了快速檢查 `getenv()`,加入一個新的環境變數 -
如果您加入一個新的環境變數,請確保不僅 Apache 而且 XAMPP 也重新啟動。
否則,`getenv()` 對於新加入的環境變數將會返回 false。
值得注意的是,由於當給定的變數未設定時,`getenv('MY_VARIABLE')` 會返回 false,因此在使用 `getenv()` 時,無法直接區分未設定的變數和明確設定為布林值(false)的變數。
這使得將布林環境變數在未設定時預設為 true 有點棘手。您可以透過使用嚴格比較運算子與像是 0 的「虛值」,或是使用超全域陣列和 `isset()` 來解決這個問題。
SERVER_NAME 是在 Apache 設定中定義的名稱。
HTTP_HOST 是使用較新版本的 HTTP 協議時,客戶端傳送的主機標頭。
從 PHP 7.1 開始 => `getenv()` 不再需要參數。如果省略參數,則目前的環境變數將會以關聯陣列的形式返回。
來源:https://php.dev.org.tw/manual/en/migration71.changed-functions.php
當撰寫 CLI 應用程式時,請注意在您的 Web 伺服器設定中設定的任何環境變數都不會被傳遞。 PHP 將會傳遞以您 `php.ini` 中的 `safe_mode_allowed_env_vars` 指令為首碼的系統環境變數。