我正在使用.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类时,它开始工作。
答案 0 :(得分:0)
vlucas/phpdotenv
会引发异常,如果您尝试对其进行初始化,并且找不到合适的.env
文件。 was discussed和作者最终决定不更改此行为。在该问题中讨论了两种解决方法,两种方法均有效:
仅在可以找到文件的情况下初始化Dotenv,例如像
<?php
use Dotenv\Dotenv;
if (file_exists(__DIR__ . '/.env')) {
$dotenv = Dotenv::create(__DIR__);
$dotenv->load();
}
捕获异常,例如
<?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文件是否存在。