laravel 由于生产配置中缺少环境变量,Artisan迁移在开发环境中失败

yqyhoc1h  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(146)

我有两个数据库配置,一个用于生产,一个用于开发:

// 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关心我的生产配置中的环境变量是否存在,而我甚至不想使用生产配置?我该如何解决这个问题?

hgc7kmma

hgc7kmma1#

.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=

不同之处在于键的名称。除此之外,如果问题与bash和AWS有关,则为this might be of interest

ct3nt3jp

ct3nt3jp2#

我的建议是使用环境变量,并确保环境之间的键匹配(我认为这是最大的问题)。

// 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}

相关问题