无法使用PHP访问Heroku变量

时间:2019-04-01 21:54:17

标签: php heroku composer-php environment-variables

我正在使用.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类时,它开始工作。

2 个答案:

答案 0 :(得分:0)

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,就不会这样做。

答案 1 :(得分:0)

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

<?php
use Dotenv\Dotenv;

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

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