getenv()とPHPの$ _ENV


88

違いは何であるgetenv()とは$_ENV

どちらかを使用することの間のトレードオフはありますか?

getenv()必要なものが提供されることもありますが、提供されないこともあります$_ENV(などHOME)。


1
あなたから残酷な詳細を隠しているPHPにとらわれないでください。$_ENVそして$_SERVER、様々な方法で得られたデータが取り込まれます。getenv()PHPでは直接アクセスできないデータにアクセスするもう1つの方法です。、が空のvariables_order = "G"場合でも機能します。ConorMcDermottroeによるすばらしい答えを読んでください。$_SERVER$_ENV
パレック2015


Symfonyフレームワークを使用している人のために、上記のもう1つの限定されたケースがあります。getenv()は、後で変更された場合でも、phpサーバーの起動時と同じように常にenv変数の値を返します。$ _ENV []は、実行時に.envファイルを変更することで変更できます。しかしもちろん、それはSymfonyに関連しており、一般的なPHPには関連していません。
ロスIvantsiv19年

回答:


59

getenvに関するphpのドキュメントによるとgetenv大文字と小文字を区別しない方法で変数を検索することを除いて、まったく同じです。ほとんどの場合、それはおそらく問題ではありませんが、ドキュメントのコメントの1つは次のように説明しています。

たとえば、Windowsの場合、$ _ SERVER ['Path']は表示されているとおりで、最初の文字が大文字になっています。予想どおり 'PATH'ではありません。

そのため、getenv取得しようとしている変数のタイトルの大文字と小文字が確実でない限り、おそらく使用することを選択します。


14
$ _ENV( "FOO")とgetenv( "FOO")が異なる結果を返す理由については説明していません。
リッチリマー2016

追加の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が環境変数をフェッチする方法が3つあるためです。

  1. 経由sapi_getenv(たとえば、Apacheから環境変数を取得している場合)
  2. Windowsの場合、 GetEnvironmentVariableA
  3. Windows以外の場合は、getenvによって提供される関数からlibc

私の知る限り、大文字と小文字を区別せずに動作するのはWindowsのみです。これは、Windows環境変数APIがそのように動作するためです。Linux、BSD、Macなどを使用している場合getenvている場合でも、大文字と小文字は区別されます。

で述べたようにマリオ$_ENVいつもの異なる構成のために移入されませんvariables_orderあなたが避ける場合、それがベストですので、$_ENVサーバー構成を制御しない場合。

したがって、最も移植性の高いPHPコードの場合:

  1. 使用する getenvます。
  2. 環境変数名には正しい大文字と小文字を使用してください。

36

さらに$_ENV、リストされvariables_orderEいない場合、通常は空です。多くのセットアップで$_SERVERは、データのみが入力される可能性が高く、$_ENVCLIでの使用のみを目的としています。

一方getenv()、環境に直接アクセスします。

(ケースのあいまいさに関しては、もっと単純に採用することができますarray_change_key_case()。)


6

有効になっていると未定義になることがあるgetenv()という奇妙なPHPバグを回避するのに役立つことがわかりました(最初に使用したときに_SERVER変数_ENV変数を作成します)。それ以来、私はそれを使い始めました。$_SERVER$_ENVauto_globals_jit


3

PHPドキュメントから取得

この関数は$_SERVER$_ENV配列の大文字と小文字を区別しない方法で$ varnameキーを検索するため、(、と比較して)便利です。たとえば、Windowsでは$_SERVER['Path']PATH期待どおりに' 'ではなく、大文字で表示されているように見えます。これだけ:<?php getenv('path') ?>


3

getenv()は、関数として、テスト目的でオーバーロードされる可能性があるため、より適切な選択であると付け加えます。一方、$ _ SERVERまたは$ _ENV変数を上書きすると、テストフレームワークや他のライブラリに干渉する可能性があり、最終的には安全に実行するためにより多くの作業が必要になります。


0

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);
    }
}
?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.