【问题标题】:Laravel 5.1 - Checking a Database ConnectionLaravel 5.1 - 检查数据库连接
【发布时间】:2015-10-30 09:35:00
【问题描述】:

我正在尝试检查 Laravel 中是否连接了数据库。

我查看了文档,但找不到任何东西。我找到的最接近的是this,但这并不能解决我的问题。

我在不同的机器上设置了三个 MySQL 实例。下面是我想要实现的简化版本。

  1. 如果数据库 1 已连接,则将数据保存到其中
  2. 如果数据库 1 没有连接,检查数据库 2 是否连接
  3. 如果数据库 2 已连接,则将数据保存到其中
  4. 如果数据库2没有连接,检查数据库3是否连接
  5. 如果数据库 3 已连接,则将数据保存到其中

需要明确的是,有没有办法在 Laravel 5.1 中检查数据库是否已连接?

【问题讨论】:

  • 最明显的方法是在 try-catch 中从数据库中选择一些东西。每当抛出异常时,服务器/连接不可用(假设没有任何其他错误 - 您可能希望在此处使用异常代码,以确保它不是查询问题(例如缺少列或其他内容))。
  • @milz 这是我的第一个想法,但我希望有一个预先存在的方法。

标签: php mysql laravel


【解决方案1】:

您可以将 alexw's 解决方案与 Artisan 一起使用。在命令行中运行以下命令。

php artisan tinker
DB::connection()->getPdo();

如果连接正常,你应该会看到

CONNECTION_STATUS: "连接正常;等待发送。",

接近响应的结尾。

【讨论】:

  • 你能提供原始解决方案的链接吗?
  • 顺便说一句,php artisan tinker DB:connection() 可以针对vendor/laravel/framework/src/Illuminate/Database/Connection.php 类中的任何API公共端点,特别是getConfig(),这真的很方便获取信息详细信息以连接到数据库存在,允许您从您选择的客户端手动尝试该连接。
  • 这实际上比写一个函数要快
【解决方案2】:

尝试只获取底层 PDO 实例。如果 那个 失败,那么 Laravel 就无法连接到数据库!

use Illuminate\Support\Facades\DB;

// Test database connection
try {
    DB::connection()->getPdo();
} catch (\Exception $e) {
    die("Could not connect to the database.  Please check your configuration. error:" . $e );
}

【讨论】:

  • @YasserMoussa,你把它放在需要检查数据库连接的地方。
  • @alexw 好的,例如我需要在 laravel 首次启动时使用此代码,所以我在 AppServiceProvider 中的 boot() 方法和 catch die() 上使用了它,但返回 view('errors.我需要的数据库')不起作用它只是显示了laravel错误页面..我错过了什么吗?
  • 不确定 - 可以尝试使用 Freenode IRC 中的#laravel 来解决您的具体情况。
  • 这对我不起作用 - getPdo() 超时时间比 nginx 超时时间长,我不想弄乱服务器配置,我只想检查我是否可以访问我的数据库。
  • 伙计们,你可以创建一个路由并添加这些代码来测试:D
【解决方案3】:

你也可以运行这个:

php artisan migrate:status

它建立一个数据库连接连接以从迁移表中获取迁移。如果连接失败会抛出异常。

【讨论】:

    【解决方案4】:

    你可以使用这个查询来检查 laravel 中的数据库连接:

    use Illuminate\Support\Facades\DB;
    // ...
    $pdo = DB::connection()->getPdo();
    
    if($pdo)
       {
         echo "Connected successfully to database ".DB::connection()->getDatabaseName();
       } else {
         echo "You are not connected to database";
       }
    

    欲了解更多信息,您可以查看此页面https://laravel.com/docs/5.0/database

    【讨论】:

    • 此检查似乎从配置中读取,而不是从活动连接中读取。如果连接参数不正确,这仍然会报告连接成功。
    • 这段代码只返回配置文件中的值!
    • 这个答案具有误导性。任何来这里的人都必须看看下面@alexw的答案
    • 对于后来被 cmets 混淆的读者认为这是一个错误的答案,当它似乎与@alexw 的基本相同时,原因是:这个答案,用于阅读if(DB::connection()->getDatabaseName()),但在评论反馈,答案已更新为改用DB::connection()->getPdo()
    • 对于后面的读者对返回配置和不做任何检查的前两个 cmets 感到困惑,他们是错误的。确保您通过不更改本地主机 IP 地址中的最后一位数字(如 127.0.0.1 到 127.0.0.23)进行测试,因为第二个地址仍将解析为您的本地主机,因此此检查无用。
    【解决方案5】:

    您可以在控制器方法或路由的内联函数中使用它:

       use Illuminate\Support\Facades\DB;
       //....
       try {
            DB::connection()->getPdo();
            if(DB::connection()->getDatabaseName()){
                echo "Yes! Successfully connected to the DB: " . DB::connection()->getDatabaseName();
            }else{
                die("Could not find the database. Please check your configuration.");
            }
        } catch (\Exception $e) {
            die("Could not open connection to database server.  Please check your configuration.");
        }
    

    【讨论】:

    • 你可以将它作为内联函数添加到路由(web.php)或任何控制器方法中
    • 据我测试,似乎不需要->getDatabaseName() 部分,因为->getPdo() 已经抛出错误(如果我错了,我会很高兴知道那个)。
    【解决方案6】:

    另一种方法:

    当 Laravel 尝试连接数据库时,如果连接失败或发现任何错误,它将返回 PDOException 错误。我们可以捕获这个错误并重定向操作

    app/filtes.php 文件中添加以下代码。

    App::error(function(PDOException $exception)
    {
        Log::error("Error connecting to database: ".$exception->getMessage());
    
        return "Error connecting to database";
    });
    

    希望这有帮助。

    【讨论】:

    • 您的意思是 app/filters.php 吗?那里缺少一个“r”。问题是 laravel 5.1 和 5.1 中的 laravel 结构不使用 app/filters.php 目录。这适用于 laravel 4。
    • 来自 redbear 的评论:@ArtisanBay 的方法听起来很有效。如果过滤器不再可用,也许您可​​以尝试在中间件中编写。
    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多