อะไรคือความแตกต่างระหว่างgetenv()
และ$_ENV
?
การแลกเปลี่ยนระหว่างการใช้อย่างใดอย่างหนึ่ง?
ฉันสังเกตเห็นบางครั้งgetenv()
ให้สิ่งที่ฉันต้องการในขณะที่$_ENV
ไม่ได้ (เช่นHOME
)
อะไรคือความแตกต่างระหว่างgetenv()
และ$_ENV
?
การแลกเปลี่ยนระหว่างการใช้อย่างใดอย่างหนึ่ง?
ฉันสังเกตเห็นบางครั้งgetenv()
ให้สิ่งที่ฉันต้องการในขณะที่$_ENV
ไม่ได้ (เช่นHOME
)
คำตอบ:
ตามเอกสาร php เกี่ยวกับ getenvมันเหมือนกันทุกgetenv
ประการยกเว้นว่าจะมองหาตัวแปรในลักษณะที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ส่วนใหญ่แล้วอาจไม่สำคัญ แต่หนึ่งในความคิดเห็นในเอกสารอธิบาย:
ตัวอย่างเช่นใน Windows $ _SERVER ['Path'] ก็เหมือนที่คุณเห็นโดยตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ไม่ใช่ "PATH" อย่างที่คุณคาดหวัง
ด้วยเหตุนี้ฉันจึงอาจเลือกใช้getenv
เว้นแต่คุณจะแน่ใจเกี่ยวกับปลอกของชื่อเรื่องของตัวแปรที่คุณพยายามดึง
getenv()
ข้อดีเพิ่มเติม: คุณไม่จำเป็นต้องตรวจสอบisset
/ empty
ก่อนเข้าถึง getenv()
จะไม่แจ้งเตือน
ฉันรู้ว่าความคิดเห็นในเอกสารบอกว่าgetenv
ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ แต่นั่นไม่ใช่พฤติกรรมที่ฉันเห็น:
> env FOO=bar php -r 'print getenv("FOO") . "\n";'
bar
> env FOO=bar php -r 'print getenv("foo") . "\n";'
> env foo=bar php -r 'print getenv("foo") . "\n";'
bar
> env foo=bar php -r 'print getenv("FOO") . "\n";'
> php --version
PHP 5.4.24 (cli) (built: Jan 24 2014 03:51:25)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
ดูที่ซอร์สโค้ดสำหรับgetenv
ฟังก์ชันเนื่องจากมีสามวิธีที่ PHP สามารถดึงตัวแปรสภาพแวดล้อม:
sapi_getenv
(เช่นหากได้รับตัวแปรสภาพแวดล้อมจาก Apache)GetEnvironmentVariableA
.getenv
ฟังก์ชันที่มีให้โดยlibc
.เท่าที่ฉันสามารถบอกได้มีเพียงครั้งเดียวที่มันจะทำงานในลักษณะที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่คือบน Windows เพราะนั่นคือลักษณะการทำงานของ API ตัวแปรสภาพแวดล้อมของ Windows หากคุณใช้ Linux, BSD, Mac เป็นต้นgetenv
ยังคงพิจารณาตัวพิมพ์เล็กและใหญ่
ดังกล่าวโดยมาริโอ , $_ENV
ไม่ได้บรรจุอยู่เสมอเนื่องจากการกำหนดค่าที่แตกต่างกันของvariables_order
ดังนั้นจึงเป็นเรื่องที่ดีที่สุดถ้าคุณหลีกเลี่ยง$_ENV
ถ้าคุณไม่ได้ควบคุมการตั้งค่าเซิร์ฟเวอร์
ดังนั้นสำหรับโค้ด PHP แบบพกพาส่วนใหญ่:
getenv
.นอกจาก$_ENV
นี้มักจะว่างเปล่าหากvariables_order
ไม่มีในE
รายการ ในการตั้งค่าจำนวนมากมีแนวโน้มว่า$_SERVER
จะมีการเติมข้อมูลเท่านั้นและ$_ENV
มีไว้สำหรับการใช้งาน CLI เท่านั้น
ในทางกลับกันgetenv()
เข้าถึงสภาพแวดล้อมโดยตรง
(เกี่ยวกับความคลุมเครือของกรณีสามารถใช้งานได้array_change_key_case()
มากกว่า)
ฉันพบว่าgetenv()
มีประโยชน์ในการหลีกเลี่ยงข้อผิดพลาด PHP แปลก ๆซึ่งบางครั้ง$_SERVER
และ$_ENV
ไม่ได้กำหนดว่าauto_globals_jit
เปิดใช้งานอยู่หรือไม่ (สร้างตัวแปร_SERVERและ_ENVเมื่อใช้ครั้งแรก) ตั้งแต่นั้นมาฉันก็เริ่มใช้มัน
นำมาจากเอกสาร PHP :
ฟังก์ชั่นนี้จะเป็นประโยชน์ (เมื่อเทียบกับ
$_SERVER
,$_ENV
) เพราะมันค้นหาคีย์ varName $ ในอาร์เรย์ลักษณะกรณีตายเหล่านั้น ตัวอย่างเช่นใน Windows$_SERVER['Path']
ก็เหมือนกับที่คุณเห็นเป็นตัวพิมพ์ใหญ่ไม่ใช่ 'PATH
' ตามที่คุณคาดไว้ เพียงแค่:<?php getenv('path') ?>
ฉันขอเพิ่มว่า getenv () เป็นตัวเลือกที่ดีกว่าเพราะตามหน้าที่แล้วมันสามารถโอเวอร์โหลดได้เพื่อวัตถุประสงค์ในการทดสอบ ในขณะที่การเขียนทับตัวแปร $ _SERVER หรือ $ _ENV ของคุณอาจรบกวนกรอบการทดสอบและไลบรารีอื่น ๆ และท้ายที่สุดก็ต้องใช้งานมากขึ้นเพื่อดำเนินการอย่างปลอดภัย
อ่าน env และสร้าง
<?php
namespace neoistone;
class ns_env {
/**
* env to array file storage
*
* @param $envPath
*/
public static function envToArray(string $envPath)
{
$variables = [];
$mread = fopen($envPath, "r");
$content = fread($mread,filesize($envPath));
fclose($mread);
$lines = explode("\n", $content);
if($lines) {
foreach($lines as $line) {
// If not an empty line then parse line
if($line !== "") {
// Find position of first equals symbol
$equalsLocation = strpos($line, '=');
// Pull everything to the left of the first equals
$key = substr($line, 0, $equalsLocation);
// Pull everything to the right from the equals to end of the line
$value = substr($line, ($equalsLocation + 1), strlen($line));
$variables[$key] = $value;
} else {
$variables[] = "";
}
}
}
return $variables;
}
/**
* Array to .env file storage
*
* @param $array
* @param $envPath
*/
public static function arrayToEnv(array $array, string $envPath)
{
$env = "";
$position = 0;
foreach($array as $key => $value) {
$position++;
// If value isn't blank, or key isn't numeric meaning not a blank line, then add entry
if($value !== "" || !is_numeric($key)) {
// If passed in option is a boolean (true or false) this will normally
// save as 1 or 0. But we want to keep the value as words.
if(is_bool($value)) {
if($value === true) {
$value = "true";
} else {
$value = "false";
}
}
// Always convert $key to uppercase
$env .= strtoupper($key) . "=" . $value;
// If isn't last item in array add new line to end
if($position != count($array)) {
$env .= "\n";
}
} else {
$env .= "\n";
}
}
$mwrite = fopen($envPath, "w");
fwrite($mwrite, $env);
fclose($mwrite);
}
/**
* Json to .env file storage
*
* @param $json
* @param $envPath
*/
public static function JsonToEnv(array $json, string $envPath)
{
$env = "";
$position = 0;
$array = json_decode($json,true);
foreach($array as $key => $value) {
$position++;
// If value isn't blank, or key isn't numeric meaning not a blank line, then add entry
if($value !== "" || !is_numeric($key)) {
// If passed in option is a boolean (true or false) this will normally
// save as 1 or 0. But we want to keep the value as words.
if(is_bool($value)) {
if($value === true) {
$value = "true";
} else {
$value = "false";
}
}
// Always convert $key to uppercase
$env .= strtoupper($key) . "=" . $value;
// If isn't last item in array add new line to end
if($position != count($array)) {
$env .= "\n";
}
} else {
$env .= "\n";
}
}
$mwrite = fopen($envPath, "w");
fwrite($mwrite, $env);
fclose($mwrite);
}
/**
* XML to .env file storage
*
* @param $json
* @param $envPath
*/
public static function XmlToEnv(array $xml, string $envPath)
{
$env = "";
$position = 0;
$array = simplexml_load_string($xml);
foreach($array as $key => $value) {
$position++;
// If value isn't blank, or key isn't numeric meaning not a blank line, then add entry
if($value !== "" || !is_numeric($key)) {
// If passed in option is a boolean (true or false) this will normally
// save as 1 or 0. But we want to keep the value as words.
if(is_bool($value)) {
if($value === true) {
$value = "true";
} else {
$value = "false";
}
}
// Always convert $key to uppercase
$env .= strtoupper($key) . "=" . $value;
// If isn't last item in array add new line to end
if($position != count($array)) {
$env .= "\n";
}
} else {
$env .= "\n";
}
}
$mwrite = fopen($envPath, "w");
fwrite($mwrite, $env);
fclose($mwrite);
}
}
?>
$_ENV
และ$_SERVER
มีการเติมข้อมูลที่ได้รับในรูปแบบต่างๆgetenv()
ยังเป็นอีกวิธีหนึ่งในการเข้าถึงข้อมูลที่ PHP ไม่อนุญาตให้คุณเข้าถึงโดยตรง ใช้งานได้แม้variables_order = "G"
เมื่อใด$_SERVER
และ$_ENV
ว่างเปล่า อ่านคำตอบที่ดีโดยคอเนอร์แมคเดอร์ มอตโตร