本地 Laravel 环境未连接到 AWS RDS 数据库

Posted

技术标签:

【中文标题】本地 Laravel 环境未连接到 AWS RDS 数据库【英文标题】:Local Laravel environment not connecting to AWS RDS database 【发布时间】:2019-12-02 09:56:02 【问题描述】:

我已经为开发目的设置了一个本地 Laravel 环境。难以连接到远程 AWS RDS Database 数据库。

.env 设置

APP_NAME=Laravel
APP_ENV=local
APP_KEY=<APP-KEY>
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=<AWS-RDS-DATABASE-PATH>
DB_PORT=3306
DB_DATABASE=<DB-NAME>
DB_USERNAME=<DB-USERNAME>
DB_PASSWORD=<DB-PASSWORD>

config/database.php

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '<AWS-RDS-DATABASE-PATH>'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', '<DB-NAME>'),
    'username' => env('DB_USERNAME', '<DB-USERNAME>'),
    'password' => env('DB_PASSWORD', '<DB-PASSWORD>'),
    'unix_socket' => env('DB_SOCKET', '/tmp/mysql.sock'),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
],

适用于 CodeIgniter - config/database.php [设置相同]

$db['default'] = array(
    'dsn'   => '',
    'hostname' => '<AWS-RDS-DATABASE-PATH>',
    'username' => '<DB-USERNAME>',
    'password' => '<DB-PASSWORD>',
    'database' => '<DB-NAME>',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

可能是什么问题?

【问题讨论】:

【参考方案1】:

您收到错误消息吗?这可能会有所帮助。

【讨论】:

SQLSTATE[HY000] [1045] 用户''@'localhost'的访问被拒绝 试试php artisan cache:clear 看起来变量被缓存了 配置或缓存有问题。错误消息不应包含 localhost 而是 DB Server。【参考方案2】:

在我全新安装 Laravel 后,它现在可以工作了。

【讨论】:

【参考方案3】:

将此代码添加到 /config/database.php 的顶部

use Illuminate\Support\Str;

define('RDS_HOSTNAME', (isset($_SERVER['RDS_HOSTNAME'])) ? $_SERVER['RDS_HOSTNAME'] : null);
define('RDS_USERNAME', (isset($_SERVER['RDS_USERNAME'])) ? $_SERVER['RDS_USERNAME'] : null);
define('RDS_PASSWORD', (isset($_SERVER['RDS_PASSWORD'])) ? $_SERVER['RDS_PASSWORD'] : null);
define('RDS_DB_NAME', (isset($_SERVER['RDS_DB_NAME'])) ? $_SERVER['RDS_DB_NAME'] : null);

并将您的 MySQL 连接更改为:

        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => (RDS_HOSTNAME) ? RDS_HOSTNAME : env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => (RDS_DB_NAME) ? RDS_DB_NAME : env('DB_DATABASE', 'forge'),
            'username' => (RDS_USERNAME) ? RDS_USERNAME : env('DB_USERNAME', 'forge'),
            'password' => (RDS_PASSWORD) ? RDS_PASSWORD : env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => false,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

【讨论】:

以上是关于本地 Laravel 环境未连接到 AWS RDS 数据库的主要内容,如果未能解决你的问题,请参考以下文章

在本地环境中连接 RDS 数据库

Laravel Docker 容器未连接到本地 mysql

AWS Lambda 无法连接到 RDS 实例,但我可以在本地连接?

如何从本地使用 SSL 加密连接到 AWS RDS?

出于开发目的,无法从本地主机连接到 AWS RDS Postgresql

自 SSL/TLS 证书更新以来,Django 应用程序未连接到 RDS