PHP'de getenv () ile $ _ENV karşılaştırması


88

Arasındaki fark nedir getenv()ve $_ENV?

İkisini de kullanmak arasında herhangi bir denge var mı?

Fark ettim ki bazen getenv()bana ihtiyacım olanı verirken $_ENVvermiyor (gibi HOME).


1
Kanlı ayrıntıları sizden gizleyen PHP tarafından tuzağa düşmeyin. $_ENVve $_SERVERçeşitli yollarla elde edilen verilerle doldurulur. getenv()PHP'nin doğrudan erişmenizi sağlamadığı verilere erişmenin başka bir yoludur. Hatta ile çalışır variables_order = "G", ne zaman $_SERVERve $_ENVboştur. Conor McDermottroe'nun harika cevabını okuyun .
Palec


Symfony çerçevesini kullananlar için, yukarıdakilerin bir tane daha sınırlı durumu var. getenv (), daha sonra değiştirilmiş olsa bile, php sunucusu başladığında olduğu gibi her zaman env değişkeninin değerini döndürecektir. $ _ENV [], .env dosyaları değiştirilerek çalışma zamanında değiştirilebilir. Ancak elbette Symfony ile ilgilidir ve genel olarak PHP ile ilgili değildir.
Ross Ivantsiv

Yanıtlar:


60

Getenv ile ilgili php belgelerine göre getenv, değişkeni büyük / küçük harfe duyarsız bir şekilde aramaları dışında tamamen aynıdır . Çoğu zaman büyük olasılıkla önemli değildir, ancak belgelerdeki yorumlardan biri açıklıyor:

Örneğin, Windows $ _SERVER ['Yol'], gördüğünüz gibi, beklediğiniz gibi 'PATH' değil, ilk harf büyük olacak şekilde.

Bu nedenle getenv, almaya çalıştığınız değişkenin büyük / küçük harf durumundan emin değilseniz, muhtemelen kullanmayı tercih ederim.


15
$ _ENV ("FOO") ve getenv'in ("FOO") neden farklı sonuçlar döndürdüğünü açıklamıyor.
rich remer

Ek getenv()avantaj: erişimden önce isset/ kontrol etmenize gerek yoktur empty. getenv()bildirimler yayınlamaz.
Steve Clay

53

Belgelerdeki yorumun getenvbüyük / küçük harfe duyarlı olmadığını söylediğini biliyorum , ancak benim gördüğüm davranış bu değil :

> 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

Baktığımızda kaynak kodu için getenvPHP ortam değişkeni alabilmesi üç yolu vardır çünkü fonksiyonu şudur:

  1. Via sapi_getenv(örneğin, Apache'den ortam değişkenini alıyorsa)
  2. Windows'ta ise GetEnvironmentVariableA.
  3. Windows dışında ise, getenvtarafından sağlanan işlevden libc.

Anlayabildiğim kadarıyla, büyük / küçük harfe duyarsız bir şekilde davranacağı tek zaman Windows üzerindedir, çünkü Windows ortam değişkeni API'si böyle davranır. Linux, BSD, Mac, vb. Kullanıyorsanız getenv, yine de büyük / küçük harfe duyarlıdır.

Mario tarafından belirtildiği gibi , $_ENVfarklı yapılandırmalar nedeniyle her zaman doldurulmaz, variables_orderbu nedenle $_ENVsunucu yapılandırmasını kontrol etmiyorsanız kaçınmanız en iyisidir .

Yani, en taşınabilir PHP kodu için:

  1. Kullanın getenv.
  2. Ortam değişkeni adı için doğru büyük / küçük harf kullanın.

39

Ayrıca $_ENVeğer tipik boş olduğu variables_orderdoes't var Elistelenmiş. Çoğu kurulumda muhtemelen yalnızca $_SERVERdoldurulmuş ve $_ENVkesinlikle CLI kullanımı içindir.

Diğer yandan getenv()ortama doğrudan erişir.

(Durum belirsizliği ile ilgili olarak, kişi daha basit bir şekilde kullanılabilir array_change_key_case().)


6

Etkinleştirildiğinde bazen tanımlanmamış ve tanımlanmamış garip bir PHP hatasındangetenv() kaçınmak için yararlı buldum ( ilk kullanıldığında _SERVER ve _ENV değişkenlerini oluşturmak ). O zamandan beri kullanmaya başladım.$_SERVER$_ENVauto_globals_jit


3

Alındığı PHP docs :

Bu fonksiyon, (göre yararlıdır $_SERVER, $_ENVbu o dizi harf duyarlı bir şekilde $ değişken anahtarını arar için). Örneğin Windows'ta beklediğiniz gibi $_SERVER['Path']değil, Büyük Harfli'yi gördüğünüz gibidir PATH. Bu yüzden sadece:<?php getenv('path') ?>


3

Getenv () 'nin daha iyi bir seçim olduğunu eklemeliyim, çünkü bir işlev olarak test amacıyla aşırı yüklenebilir. Oysa $ _SERVER veya $ _ENV değişkenlerinizin üzerine yazmak, test çerçevelerini ve diğer kitaplıkları engelleyebilir ve sonuçta güvenli bir şekilde yürütmek için çok daha fazla çalışma gerektirebilir.


-1

env oku ve oluştur

<?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);
    }
}
?>

Bunun asıl soruyla ne alakası var?
siklon kodu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.