我有两个数据库配置,一个用于生产,一个用于开发:
// app/config/database.php
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => $_SERVER['RDS_HOSTNAME'],
'database' => $_SERVER['RDS_DB_NAME'],
'username' => $_SERVER['RDS_USERNAME'],
'password' => $_SERVER['RDS_PASSWORD'],
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
)
)
// app/config/development/database.php
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => $_SERVER['MYSQL_PORT_3306_TCP_ADDR'],
'database' => $_SERVER['MYSQL_ENV_MYSQL_DATABASE'],
'username' => $_SERVER['MYSQL_ENV_MYSQL_USER'],
'password' => $_SERVER['MYSQL_ENV_MYSQL_PASSWORD'],
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
)
)
存在相关的数据库环境变量(以MYSQL_
开头的那些变量),以及运行migrate命令时:
php artisan migrate --env=development
抛出以下异常:
{
"error":{
"type":"ErrorException",
"message":"Undefined index: RDS_HOSTNAME",
"file":"/var/www/app/config/database.php",
"line":50
}
}
为什么当我甚至不想使用生产配置时,Laravel是否关心生产配置中的环境变量是否存在?我该如何解决这个问题?
答案 0 :(得分:1)
当您的 .env
文件中包含以下内容时,可能会发生此问题
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=root
DB_PASSWORD=
相反,你应该有
RDS_CONNECTION=mysql
RDS_HOSTNAME=localhost
RDS_PORT=3306
RDS_DB_NAME=test_db
RDS_USERNAME=root
RDS_PASSWORD=
区别在于键的名称。除此之外,this might be of interest 以防该问题与 bash 和 AWS 相关。
答案 1 :(得分:0)
我的建议是使用环境变量,并确保密钥在环境之间匹配(我认为这是您最大的问题)。
// File: .env.development.php
return [
'database_mysql_host' => '',
'database_mysql_database' => '',
'database_mysql_username' => '',
'database_mysql_password' => '',
];
然后您可以删除两个配置文件,只需修改app/config/database.php
:
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => $_ENV['database_mysql_host'],
'database' => $_ENV['database_mysql_database'],
'username' => $_ENV['database_mysql_username'],
'password' => $_ENV['database_mysql_password'],
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
)
)
我暂时假设你在vhost或其他一些apache配置文件中的生产服务器上设置环境变量。从'特殊'更改那些设置它们的键。您为生产环境选择的那些与您在开发环境中使用的密钥匹配的那些:
SetEnv database_mysql_host {your value for RDS_HOSTNAME}
SetEnv database_mysql_database {your value for RDS_DB_NAME}
SetEnv database_mysql_username {your value for RDS_USERNAME}
SetEnv database_mysql_password {your value for RDS_PASSWORD}