如何从 Yii2 连接到 RDS 数据库?

Posted

技术标签:

【中文标题】如何从 Yii2 连接到 RDS 数据库?【英文标题】:How to connect to an RDS database from Yii2? 【发布时间】:2017-11-09 11:35:48 【问题描述】:

我已经在 AWS Elastic Beanstalk 上部署了一个基于 Yii2 的应用程序,我还在 Elastic Beanstalk 上创建了带有数据库(它已经有表)的 RDS 实例。但是我收到了这个错误:“SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known”

所有文件均已正确上传到 AWS 实例。

文件 /common/config/main-local.php 有:

'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=',
            'dsn' => 'mysql:host=RDS_HOSTNAME:RDS_PORT;dbname=RDS_DB_NAME',
            'username' => 'RDS_USERNAME',
            'password' => 'RDS_PASSWORD',
            'charset' => 'utf8',
        ],

可能出了什么问题?谢谢。

【问题讨论】:

【参考方案1】:

我猜你想通过环境变量传递数据库信息。您可能想尝试修改代码如下。

'components' => [
    'db' => [
        'class' => 'yii\db\Connection',
        'dsn' => 'mysql:host=',
        'dsn' => 'mysql:host='.$_SERVER['RDS_HOSTNAME'].':'.$_SERVER['RDS_PORT'].';dbname='.$_SERVER['RDS_DB_NAME'],
        'username' => $_SERVER['RDS_USERNAME'],
        'password' => $_SERVER['RDS_PASSWORD'],
        'charset' => 'utf8',
    ],

您可以在配置环境属性部分引用http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.RDS.html#rds-external-ec2classic 来配置您的环境变量。希望这行得通。

【讨论】:

我把上面的代码通过 AWS 设置了变量,但是我收到了这个错误:“PDO Exception SQLSTATE[HY000] [2002] Connection timed out”。有什么问题?谢谢。 我通过在 EC2>Network&Security>Security Groups>Edit inbound rules 上更改为“所有流量”解决了这个问题【参考方案2】:

你有 2 倍的 'dsn' 行,也许第一个存在,所以将你的配置改为这个应该可以:

'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=RDS_HOSTNAME:RDS_PORT;dbname=RDS_DB_NAME',
            'username' => 'RDS_USERNAME',
            'password' => 'RDS_PASSWORD',
            'charset' => 'utf8',
        ],

(另外我希望您知道您必须更改 RDS_* 参数:D)

【讨论】:

你的意思是:另外我希望你知道你必须改变 RDS_* 参数。谢谢 我的意思是你必须用一些实际的 FQDN 或 IP 替换例如 RDS_HOSTNAME,对于 RDS_PORT RDS_DB_NAME、RDS_USERNAME 和 RDS_PASSWORD 也是如此 我读到那些是环境变量。我可能误解了(docs.aws.amazon.com/elasticbeanstalk/latest/dg/…)。谢谢。 它们可能是环境变量,但这不是您从服务器读取这些变量的方式。如果您在链接中向下滚动,您将看到如何在 PHP 中使用这些变量填充连接字符串 我了解到Yii2上已经安装了PDO,对吗?后者是事实,变量需要像 $dbhost = $_SERVER['RDS_HOSTNAME'];这是从 Yii2 调用 RDS 数据库的方式吗?谢谢。

以上是关于如何从 Yii2 连接到 RDS 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

AWS:无法从我的机器连接到 RDS 数据库

如何使用 mySQL 工作台连接到 AWS 私有子网 VPC 中的 RDS

如何从我的 springboot 应用程序的 Docker 映像连接到 Amazon RDS 实例?

无法从 MySQL Workbench 连接到 RDS MySQL 数据库

从 dotnetcore Web 应用程序连接到 AWS RDS

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