PHP中的getenv()与$ _ENV

时间:2012-01-10 03:44:23

标签: php environment-variables

getenv()$_ENV之间的区别是什么?

使用之间的任何权衡?

我注意到有时候getenv()会向我提供我需要的内容,而$_ENV却没有(例如HOME)。

7 个答案:

答案 0 :(得分:50)

根据the php documentation about getenv,它们完全相同,只是getenv将以不区分大小写的方式查找变量。大多数时候它可能无关紧要,但文档中的一条评论解释说:

  

例如在Windows $ _SERVER ['Path']就像你看到的那样,第一个字母大写,而不是你想象中的'PATH'。

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

答案 1 :(得分:37)

我知道文档中的评论说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

查看the source code getenv函数,这是因为PHP可以通过三种方式获取环境变量:

  1. 通过sapi_getenv(例如,如果它从Apache获取环境变量)
  2. 如果在Windows上,则来自GetEnvironmentVariableA
  3. 如果是在非Windows上,请使用getenv提供的libc功能。
  4. 据我所知,唯一一次它会以不区分大小写的方式运行在Windows上,因为这就是Windows环境变量API的行为方式。如果您使用的是Linux,BSD,Mac等,那么getenv仍然区分大小写。

    正如mario所述,由于$_ENV的配置不同,variables_order并不总是已填充,因此如果您不控制服务器,则最好避免使用$_ENV配置。

    因此,对于最便携的PHP代码:

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

答案 2 :(得分:30)

如果$_ENV未列出E,则variables_order通常为空。在许多设置中,可能只填充$_SERVER$_ENV严格用于CLI。

另一方面,getenv()直接访问环境。

(关于案例歧义,可以更简单地使用array_change_key_case()。)

答案 3 :(得分:4)

我发现getenv()对于strange PHP bug非常有用,如果启用了$_SERVER,有时$_ENVauto_globals_jit未定义(创建 _SERVER < / em>和 _ENV 变量首次使用时)。从那以后我开始使用它。

答案 4 :(得分:2)

取自PHP docs

  

此函数很有用(与$_SERVER$_ENV相比),因为它以那些不区分大小写的方式搜索$ varname键。   例如,在Windows上$_SERVER['Path']就像您看到的那样大写,而不是您预期的“PATH”。   所以只需:<?php getenv('path') ?>

答案 5 :(得分:1)

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

答案 6 :(得分: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);
    }
}
?>