PHP Conference Japan 2024

putenv

(PHP 4, PHP 5, PHP 7, PHP 8)

putenv設定環境變數的值

描述

putenv(string $assignment): bool

assignment 新增至伺服器環境。環境變數僅在目前請求期間存在。在請求結束時,環境將還原為原始狀態。

參數

assignment

設定,例如 "FOO=BAR"

傳回值

成功時傳回 true,失敗時傳回 false

範例

範例 1 設定環境變數

<?php
putenv
("UNIQID=$uniqid");
?>

參見

新增筆記

使用者貢獻的筆記 6 則筆記

php at keith tyler dot com
14 年前
putenv/getenv、$_ENV 和 phpinfo(INFO_ENVIRONMENT) 是三個完全不同的環境儲存區。執行 putenv("x=y") 不會影響 $_ENV;但同樣地,執行 $_ENV["x"]="y" 也不会影響 getenv("x")。而且它們都不會影響 phpinfo() 中傳回的內容。

假設在執行以下程式碼之前,USER 環境變數定義為 "dave"

<?php
print "env is: ".$_ENV["USER"]."\n";
print
"(doing: putenv fred)\n";
putenv("USER=fred");
print
"env is: ".$_ENV["USER"]."\n";
print
"getenv is: ".getenv("USER")."\n";
print
"(doing: set _env barney)\n";
$_ENV["USER"]="barney";
print
"getenv is: ".getenv("USER")."\n";
print
"env is: ".$_ENV["USER"]."\n";
phpinfo(INFO_ENVIRONMENT);
?>

印出

env is: dave
(doing: putenv fred)
env is: dave
getenv is: fred
(doing: set _env barney)
getenv is: fred
env is: barney
phpinfo()

環境

變數 => 值
...
USER => dave
...
JM
17 年前
av01 at bugfix dot cc 的程式碼還有另一個問題是
行為與此處的註解一致,而不是那裡的註解
<?php
putenv
('MYVAR='); // 將 MYVAR 設定為空值。它在環境中
putenv('MYVAR'); // 取消設定 MYVAR。它會從環境中移除
?>
domger at freenet dot de
1 年前
當使用 getenv() 時,名稱中帶有句點的變數值不會輸出,但它們仍然存在,可以明確查詢。

(在使用 PHP 8.2.4 時看到這種行為)

<?php

// 設定
putenv('foo.bar=baz');

// 傾印所有
var_dump(getenv()); # <== 未包含變數 'foo.bar',其值未傾印

// 明確傾印 'foo.bar'
var_dump(getenv('foo.bar')); # 可用,顯示值 'baz'
t7to7
5 年前
環境變數名稱中允許有空白,因此

<?php
putenv
('U =33');
?>

與以下程式碼不等價

<?php
putenv
('U=33');
?>
david dot boyce at messagingdirect dot comnospam
24 年前
環境變數是底層作業系統的一部分
進行操作的方式,用於在父
程序與其子程序之間傳遞資訊,並影響某些內部
函式的行為。它們不應被視為普通的 PHP
變數。

在 PHP 腳本中設定環境變數的主要目的是
以便它們可供該腳本使用
例如,使用 system() 函式所叫用的程序,它們不太可能需要
因其他原因而變更。

例如,如果特定的系統命令需要一個特殊值
的環境變數 LD_LIBRARY_PATH 才能成功執行,
那麼可以在 *NIX 系統上使用以下程式碼

<?php
$saved
= getenv("LD_LIBRARY_PATH"); // 儲存舊值
$newld = "/extra/library/dir:/another/path/to/lib"; // 要加入的額外路徑
if ($saved) { $newld .= ":$saved"; } // 如果有的話,附加舊路徑
putenv("LD_LIBRARY_PATH=$newld"); // 設定新值
system("mycommand -with args"); // 執行系統命令;
// mycommand 會使用
// 新路徑列表中的函式庫載入
putenv("LD_LIBRARY_PATH=$saved"); // 還原舊值
?>

通常在使用後還原舊值是適當的做法;
LD_LIBRARY_PATH 是一個特別好的例子,說明為何
立即還原它是很重要的,因為它會被內部的
函式所使用。

如果 php.ini 設定允許,環境變數的值
在腳本開始時會被設為 PHP 全域變數,但是
這些全域變數只是一些複本,並不會追蹤腳本
進入後實際的環境變數。修改
$REMOTE_ADDR (甚至是 $HTTP_ENV_VARS["REMOTE_ADDR"]) 不應
預期會影響實際的環境變數;這就是為什麼需要
putenv()。

最後,不要依賴環境變數在腳本下次調用時保持
相同的值,特別是當你使用了 putenv()。結果取決於許多因素,像是 CGI 對比
apache 模組,以及進入腳本前環境被
操作的確切方式。
匿名程式設計師
12 年前
會傳遞給經由 exec() 執行的子程序的環境變數類型是 putenv() 設置的。

如果您需要刪除現有的環境變數,以便子程序看不到它,請使用

putenv('FOOBAR');

也就是說,省略 "=" 和值。
To Top