getenv() vs. $_ENV in PHP

后端 未结 7 1334
半阙折子戏
半阙折子戏 2020-12-05 02:00

What is the difference between getenv() and $_ENV?

Any trade-offs between using either?

I noticed sometimes getenv() g

7条回答
  •  北海茫月
    2020-12-05 02:09

    I know that the comment in the docs says that getenv is case-insensitive, but that's not the behaviour I'm seeing:

    > 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
    

    Looking at the source code for the getenv function, this is because there are three ways that PHP can fetch the environment variable:

    1. Via sapi_getenv (e.g. if it's getting the environment variable from Apache)
    2. If on Windows, from GetEnvironmentVariableA.
    3. If on non-Windows, from the getenv function provided by libc.

    As far as I can tell, the only time when it will behave in a case-insensitive manner is on Windows because that's how the Windows environment variable API behaves. If you're on Linux, BSD, Mac, etc then getenv is still case sensitive.

    As mentioned by mario, $_ENV is not always populated due to different configurations of variables_order so it's best if you avoid $_ENV if you don't control the server configuration.

    So, for the most portable PHP code:

    1. Use getenv.
    2. Use the correct case for the environment variable name.

提交回复
热议问题