getenv()与$ _ENV在PHP中


88

getenv()和之间有什么区别$_ENV

使用两者之间是否有任何取舍?

我注意到有时getenv()会给我我需要的东西,而不需要的$_ENV(例如HOME)。


1
不要被PHP隐藏,不要向您隐藏血腥的细节。$_ENV$_SERVER填充以各种方式获得的数据。getenv()这是另一种访问数据的方法,PHP不允许您直接访问数据。即使和variables_order = "G",当$_SERVER$_ENV为空时也可以使用。阅读Conor McDermottroe的精彩回答。
Palec 2015年


对于那些正在使用Symfony框架的人,上述情况则更为有限。getenv()始终会返回php服务器启动时的env变量的值,即使之后对其进行了更改。$ _ENV []可以在运行时通过修改.env文件来更改。但是,它当然与Symfony有关,而与PHP一般无关。
Ross Ivantsiv

Answers:


59

根据有关getenv的php文档,它们完全相同,除了getenv会以不区分大小写的方式查找变量。在大多数情况下,这可能并不重要,但是文档中的其中一项评论解释了:

例如,在Windows上,$ _ SERVER ['Path']就像您看到的那样,首字母大写,而不是您期望的'PATH'。

因此,getenv除非您对要检索的变量标题的大小写不确定,否则我可能会选择使用。


14
不解释为什么$ _ENV(“ FOO”)和getenv(“ FOO”)返回不同的结果。
rich remer '16

新增的getenv()优点:您无需在访问前检查isset/ emptygetenv()不会发出通知。
史蒂夫·克莱

53

我知道文档中的注释说不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可以获取环境变量:

  1. 通过sapi_getenv(例如,如果从Apache获取环境变量)
  2. 如果在Windows上,请从GetEnvironmentVariableA
  3. 如果在非Windows上,请通过getenv提供的功能libc

据我所知,它唯一不区分大小写的方式是在Windows上,因为这就是Windows环境变量API的方式。如果您使用的是Linux,BSD,Mac等,则getenv仍然区分大小写。

正如mario所提到的,$_ENV由于的配置不同,并不总是填充,variables_order所以最好避免$_ENV如果您不控制服务器配置。

因此,对于最可移植的PHP代码:

  1. 使用getenv
  2. 使用正确的大小写作为环境变量名称。


6

我发现getenv()有用的方法是避免一个奇怪的PHP错误,该错误有时在某些地方启用,$_SERVER并且$_ENV如果auto_globals_jit启用则未定义(首次使用时创建_SERVER_ENV变量)。从那时起,我开始使用它。


3

取自PHP docs

此功能很有用(与相比$_SERVER$_ENV),因为它以不区分大小写的数组形式搜索$ varname键。例如,在Windows$_SERVER['Path']上,您看到的是大写字母,而不是PATH您期望的' '。所以就:<?php getenv('path') ?>


3

我要补充一点,getenv()是一个更好的选择,因为作为一个函数,可以出于测试目的而对其进行重载。覆盖$ _SERVER或$ _ENV变量可能会干扰测试框架和其他库,最终需要进行大量工作才能安全地执行。


0

阅读环境并创建

<?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);
    }
}
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.