關於Lumen / Laravel .env 文件中的環境變數是如何生效的

来源:http://www.cnblogs.com/XiongMaoMengNan/archive/2017/07/14/7171646.html
-Advertisement-
Play Games

.env 文件包含預設環境變數,我們還可自定義其他任何有效的變數,並可通過 調用 env() 或 $_SERVER 或 $_ENV 來獲取該變數。那麼env()是如何載入到這些變數的呢?在Lumen的vendor/laravel/lumen-framework/src/helpers.php中,我們 ...


  .env 文件可自定義其他任何有效的環境變數,並可通過  調用 env() 或 $_SERVER$_ENV  來獲取該變數。那麼env()是如何載入到這些變數的呢?在Lumen的vendor/laravel/lumen-framework/src/helpers.php中,我們可以發現env函數是這樣被定義的:

if (! function_exists('env')) {
    /**
     * Gets the value of an environment variable. Supports boolean, empty and null.
     *
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    function env($key, $default = null)
    {
        $value = getenv($key);

        if ($value === false) {
            return value($default);
        }

        switch (strtolower($value)) {
            case 'true':
            case '(true)':
                return true;

            case 'false':
            case '(false)':
                return false;

            case 'empty':
            case '(empty)':
                return '';

            case 'null':
            case '(null)':
                return;
        }

        if (Str::startsWith($value, '"') && Str::endsWith($value, '"')) {
            return substr($value, 1, -1);
        }

        return $value;
    }
}

可見,env函數中調用了 getenv() 來讀取環境變數。我們又知道getenv()是PHP原生提供可讀取   $_SERVER$_ENV   全局變數的函數API,.env文件中的環境變數為何可以通過getenv()來獲取呢?vlucas/phpdotenv 就是這個幕後功臣,在Lumen 或 Laravel 的vendor下可以找到她,如果要單獨下載她,去這裡 :https://github.com/vlucas/phpdotenv 。

在vlucas/phpdotenv/src/Loader.php文件中,我們可以看到.env被載入進一個數組,然後把每一行看作setter並調用setEnvironmentVariable()方法:

/**
     * Load `.env` file in given directory.
     *
     * @return array
     */
    public function load()
    {
        $this->ensureFileIsReadable();

        $filePath = $this->filePath;
        $lines = $this->readLinesFromFile($filePath);
        foreach ($lines as $line) {
            if (!$this->isComment($line) && $this->looksLikeSetter($line)) {
                $this->setEnvironmentVariable($line);
            }
        }

        return $lines;
    }

/**
     * Read lines from the file, auto detecting line endings.
     *
     * @param string $filePath
     *
     * @return array
     */
    protected function readLinesFromFile($filePath)
    {
        // Read file into an array of lines with auto-detected line endings
        $autodetect = ini_get('auto_detect_line_endings');
        ini_set('auto_detect_line_endings', '1');
        $lines = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        ini_set('auto_detect_line_endings', $autodetect);

        return $lines;
    }

 

 Loader::setEnvironmentVariable($name, $value = null) 的定義如下:

/**
     * Set an environment variable.
     *
     * This is done using:
     * - putenv,
     * - $_ENV,
     * - $_SERVER.
     *
     * The environment variable value is stripped of single and double quotes.
     *
     * @param string      $name
     * @param string|null $value
     *
     * @return void
     */
    public function setEnvironmentVariable($name, $value = null)
    {
        list($name, $value) = $this->normaliseEnvironmentVariable($name, $value);

        // Don't overwrite existing environment variables if we're immutable
        // Ruby's dotenv does this with `ENV[key] ||= value`.
        if ($this->immutable && $this->getEnvironmentVariable($name) !== null) {
            return;
        }

        // If PHP is running as an Apache module and an existing
        // Apache environment variable exists, overwrite it
        if (function_exists('apache_getenv') && function_exists('apache_setenv') && apache_getenv($name)) {
            apache_setenv($name, $value);
        }

        if (function_exists('putenv')) {
            putenv("$name=$value");
        }

        $_ENV[$name] = $value;
        $_SERVER[$name] = $value;
    }

 

  PHP dotenv 她是什麼?

Loads environment variables from .env to getenv(), $_ENV and $_SERVER automagically.

This is a PHP version of the original Ruby dotenv.

  Why .env?

You should never store sensitive credentials in your code. Storing configuration in the environment is one of the tenets of a twelve-factor app. Anything that is likely to change between deployment environments – such as database credentials or credentials for 3rd party services – should be extracted from the code into environment variables.

Basically, a .env file is an easy way to load custom configuration variables that your application needs without having to modify .htaccess files or Apache/nginx virtual hosts. This means you won't have to edit any files outside the project, and all the environment variables are always set no matter how you run your project - Apache, Nginx, CLI, and even PHP 5.4's built-in webserver. It's WAY easier than all the other ways you know of to set environment variables, and you're going to love it.

. NO editing virtual hosts in Apache or Nginx
. NO adding php_value flags to .htaccess files
. EASY portability and sharing of required ENV values
. COMPATIBLE with PHP's built-in web server and CLI runner

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 變數是保存存儲值的記憶體位置。也就是說,當創建一個變數時,可以在記憶體中保留一些空間。 基於變數的數據類型,解釋器分配記憶體並決定可以存儲在保留的存儲器中的內容。 因此,通過為變數分配不同的數據類型,可以在這些變數中存儲的數據類型為整數,小數或字元等等 ...
  • 基礎: 什麼是進程(process)? 每一個程式的記憶體是獨立的,例如:world不能訪問QQ。 進程:QQ是以一個整體的形式暴露給操作系統管理,裡面包含了各種資源的調用(記憶體管理、網路介面調用等)。啟動一個QQ,也就是啟動了一個進程。 什麼是線程(thread)? 線程是操作系統能夠進行運算調度的 ...
  • 總覺得書中太啰嗦,看完總結後方便日後回憶,本想偷懶網上找別人的總結,無奈找不到好的,只好自食其力,儘量總結得最好。 第一章 對象導論 看到對象導論覺得這本書 目錄: 1.1 抽象過程1.2 每個對象都有一個介面1.3 每個對象都提供服務1.4 被隱藏的具體實現1.5 復用具體實現1.6 繼承1.7 ...
  • 模式對話框 創建 Win32:DialogBox() MFC:DoMoal() 銷毀:EndDialog() 非模式 自己手動銷毀 創建: Win32: CreateWindow() MFC: Create() ShowWindow UpdateWindow 銷毀:DestroyWindow() / ...
  • 1.描述: 多個 catch 塊看上去既難看又繁瑣,但使用一個“簡約”的 catch 塊捕獲高級別的異常類(如 Exception),可能會混淆那些需要特殊處理的異常,或是捕獲了不應在程式中這一點捕獲的異常。本質上,捕獲範圍過大的異常與“Java 分類定義異常”這一目的是相違背的。 2.風險: 隨著 ...
  • 枚舉enum、聯合union成員共用一個變數緩衝區 enum是一種基本數據類型,而不是一種構造類型,因為它不能再分解為任何基本類型 有些變數的取值被限定在一個有限的範圍內 枚舉值是常量不是變數,不能再對它賦值 0,1,2,3,4 … enum weekday{sun,mon,tue,wed,thu, ...
  • 關於CSS佈局頁面的簡單組合方式: ...
  • Beautiful Soup標準庫是一個可以從HTML/XML文件中提取數據的Python庫,它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式,Beautiful Soup將會節省數小時的工作時間。pymongo標準庫是MongoDb NoSql資料庫與python語言之間的橋梁,通... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...