【问题标题】:Can't access Heroku variables with PHP无法使用 PHP 访问 Heroku 变量
【发布时间】:2019-08-23 03:37:20
【问题描述】:

我使用.env 文件作为数据库连接变量。我无法在 GitHub 上共享 .env 文件,所以我需要使用 Heroku 变量配置(我将它们设置为本地 .env 文件)。但是当我打电话给getenv('VAR_NAME') 我得到了

无法读取任何环境文件

因为没有任何.env 文件。如何使用 PHP 访问 Heroku 变量?

编辑:我正在使用这个包:https://github.com/vlucas/phpdotenv

这是我的代码:

require_once __DIR__ . '../../vendor/autoload.php';
use PDO;
use Dotenv\Dotenv as Dotenv;
public function getConnection()
        {
            $this->db_connection = null;
            try
            {
                $dotenv = Dotenv::create(__DIR__ . '/..');
                $dotenv->load();
                $this->db_connection = new PDO("mysql:host=" . getenv('DB_HOST') . ";dbname=" . getenv('DB_DATABASE'), getenv('DB_USERNAME'), getenv('DB_PASSWORD'));
                $this->db_connection->exec("set names utf8");
            }
            catch(PDOException $exception)
            {
                echo "Connection error: " . $exception->getMessage();
            }
            return $this->db_connection;
        }

__DIR__ . '/..'.env 文件的本地化

Laravel 框架也有 .env 文件,但如果 .env 文件不存在,它会创建一个后置脚本:

(composer.json)
"scripts": {
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ]
}

当我停止使用 Dotenv 类时,它开始工作。

【问题讨论】:

  • PHP 的标准 getenv().env 文件没有任何关系。它从 环境 中获取一个变量。一些工具填充环境来自 .env 文件,但getenv() 本身并不查看这些文件。但是您引用的错误专门讨论了环境files,这意味着您没有使用标准getenv()。请edit您的问题并澄清它。理想情况下,我们想要minimal reproducible example
  • 另外,“我将它们设置为本地 .env 文件”是什么意思,这与 Heroku 的配置变量有什么关系?
  • 请说明您如何初始化Dotenv
  • 您是否能够使用下面显示的答案来解决这个问题?如果是这样,请记住accept it。这会向其他用户显示您找到了解决方案。

标签: php heroku composer-php environment-variables


【解决方案1】:

只是为了确保 heroku 上没有 .env 文件,所有添加到 config 的变量都可以作为环境变量使用。所以我会建议与 Chris 建议的方法相同。

<?php
use Dotenv\Dotenv;

if (file_exists(__DIR__ . '/.env')) {
    $dotenv = Dotenv::create(__DIR__);
    $dotenv->load();
}

检查环境是否不是生产/暂存环境或 .env 文件是否存在。

【讨论】:

    【解决方案2】:

    vlucas/phpdotenv 如果您尝试对其进行初始化并且找不到合适的.env 文件,则会引发异常。这个was discussed 和作者最终决定不改变这种行为。该问题讨论了两种解决方法,两种方法都有效:

    1. 只有在可以找到文件时才初始化 Dotenv,例如像

      <?php
      use Dotenv\Dotenv;
      
      if (file_exists(__DIR__ . '/.env')) {
          $dotenv = Dotenv::create(__DIR__);
          $dotenv->load();
      }
      
    2. 捕获异常,例如

      <?php
      use Dotenv\Dotenv;
      use Dotenv\Exception\InvalidPathException;
      
      try {
          $dotenv = Dotenv::create(__DIR__);
          $dotenv->load();
      } catch (InvalidPathException $e) {
          // Do something
      }
      

    就我个人而言,我希望库能够开箱即用地优雅地处理这个问题,但如果失败了,我更喜欢上面的选项 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 2014-03-08
      • 2018-07-12
      • 2023-04-05
      • 1970-01-01
      • 2016-11-12
      • 2012-03-06
      • 2013-04-29
      相关资源
      最近更新 更多