Yii2 / PHP:检查与MySQL和PostgreSQL的连接

时间:2019-01-08 22:17:28

标签: php mysql postgresql yii2

启动Yii2 / PHP应用程序时,如何检查/等到数据库启动?

我目前使用MySQL:

$time = time();
$ok = false;
do {
  try {
    $pdo = new PDO($dsn,$username,$password);
    if ($pdo->query("SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA")) 
        $ok=true;
  } catch (\Exception $e) {
    sleep(1);
  }
} while (!$ok && time()<$time+30); 

现在,我要使我的应用程序与MySQL和PostgreSQL一起运行。

但是SELECT 1 FROM INFORMATION_SCHEMA.SCHEMATA在PostgreSQL中不起作用。

是否在两个数据库系统上都可以使用SQL语句(使用PDO数据库连接)来检查数据库是否已启动并正在运行?

2 个答案:

答案 0 :(得分:2)

Yii2具有一个属性来验证连接是否存在,实际上没有必要为此创建脚本,因为该框架已经为其支持的数据库实现了一种抽象($isActive property)。

  

$ isActive公共只读属性DB连接是否为   已建立

     

布尔布尔值getIsActive()

您可以通过以下方式在default controller中进行检查:

<?php

class DefaultController extends Controller 
{
    public function init()
    {
        if (!Yii::$app->db->isActive) {
            // The connection does not exist.
        }

        parent::init();
    }
}

除非有非常特殊的要求,否则强制等待与数据库的连接不是一个好习惯。与数据库的连接的可用性必须是应用程序启动的强制性要求,并且该应用程序不应“等待”数据库可用。

有多种方法可以按顺序或有特定要求在docker中运行容器,此link可以为您提供更好的选择,而不是将其委托给应用程序。

答案 1 :(得分:1)

您可以使用标准SQL的SELECT 1

您可以使用dbfiddle对各种服务器进行测试。

服务器可以随时消失,因此检查每个查询的错误响应是一种更好的方法。