Laravel 5.1 - 检查数据库连接

74

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

我查看了文档,但没有找到相关信息。最接近的是这个,但这并不能解决我的问题。

我有三个MySQL实例,分别安装在不同的机器上。以下是我尝试实现的简化版本。

  1. 如果连接了数据库1,则将数据保存到它
  2. 如果未连接到数据库1,则检查是否连接到数据库2
  3. 如果连接了数据库2,则将数据保存到它
  4. 如果未连接到数据库2,则检查是否连接到数据库3
  5. 如果连接了数据库3,则将数据保存到它

明确一下,在Laravel 5.1中有没有一种方法可以检查数据库是否已连接?


最明显的方法是在try-catch中从数据库中选择某些内容。每当抛出异常时,服务器/连接就不可用(假设没有其他错误-您可能想在此处使用异常代码,以确保它不是查询问题(例如缺少列或其他问题))。 - Luís Cruz
@milz 这是我的第一个想法,但我希望有一个现成的方法来解决这个问题。 - Enijar
7个回答

156

尝试获取底层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 );
}

1
@YasserMoussa,您可以将其放在需要检查数据库连接是否正常的任何位置。 - alexw
2
@alexw 好的,举个例子,当 Laravel 第一次启动时,我需要使用这段代码,所以我在 AppServiceProvider 的 boot() 方法中使用了它,在 catch 中 die() 是有效的,但是我需要的 return view('errors.database') 却没有生效,它只显示了 Laravel 的错误页面... 我是不是漏掉了什么? - Yasser Moussa
1
不确定的话,可以尝试在 Freenode IRC 中的 #laravel 频道寻求帮助解决您的具体问题。 - alexw
1
这对我行不通 - getPdo()的超时时间比nginx的超时时间长,而且我不想搞乱服务器配置,我只想检查一下是否可以访问我的数据库。 - Serge Kuharev
1
大家好,你们可以创建一个路由并添加这些代码来进行测试:D - Manh Nguyen
显示剩余2条评论

117

你可以使用alexw的解决方案,并通过Artisan运行以下命令。

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

如果连接正常,您应该会在响应的末尾看到

CONNECTION_STATUS: "Connection OK; waiting to send.",

附近。


你能提供原始解决方案的链接吗? - lofihelsinki
4
顺便提一下,php artisan tinker DB:connection() 可以针对 vendor/laravel/framework/src/Illuminate/Database/Connection.php 类中的任何 API 公共端点进行定位,特别是 getConfig(),这非常方便,可以获取连接到 DB 的详细信息,允许您从所选客户端手动尝试该连接。 - Fabien Haddadi
这实际上比编写一个函数更快 - Andres Felipe

20

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

   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.");
    }

1
你可以将此作为内联函数添加到路由(web.php)或任何控制器方法中。 - Luca C.
1
就我所测试的情况来看,似乎不需要 ->getDatabaseName() 部分,因为 ->getPdo() 已经会抛出错误(如果我错了,我很乐意知道)。 - giovannipds

19

您也可以运行此命令:

php artisan migrate:status

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


请注意,这需要应用程序中的数据库用户具有访问数据库信息模式(information_schema)的权限才能成功。 - undefined

10
您可以使用以下查询来检查Laravel中的数据库连接:

您可以在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


16
这个检查似乎从配置中读取,而不是从活动连接中读取。如果连接参数不正确,它仍然会报告连接成功。 - scottlimmer
3
这段代码只会返回配置文件中的数值! - Hamid Parchami
9
这个答案是误导性的。来到这里的任何人都必须查看下面 @alexw 的回答。 - Peter Chaula
1
对于后来的读者,如果他们对这个答案被认为是错误的感到困惑,因为它似乎与@alexw的答案基本相同,原因是:这个答案曾经是 if(DB::connection()->getDatabaseName()),但在评论反馈之后,答案已更新为使用 DB::connection()->getPdo() - Daryn
对于后来的读者,如果前两个评论关于返回配置并不进行任何检查让你感到困惑,那么它们是错误的。确保测试时不要更改本地主机IP地址中的最后一位数字(例如从127.0.0.1更改为127.0.0.23),因为第二个地址仍将解析为您的本地主机,从而使此检查无效。 - Alex

2

我不知道这是否适用于laravel的那个版本,但至少在更新的版本中,你可以运行以下命令:

php artisan db 

如果您的应用程序可以访问数据库,则应该看到与之对应的CLI REPL,对于PostgreSQL,您将看到一个psql实例。


在 Laravel 9 中,您可以执行 php artisan db:show - Dorian Massoulier

0

另一种方法:

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

app/filters.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 的,而在 Laravel 5.1 结构中并没有使用 app/filters.php 目录。那个是用于 Laravel 4 的。 - MaXi32
从Redbear的评论中:@ArtisanBay的方法听起来是可行的。如果过滤器不再可用,也许您可以尝试编写中间件。 - justAbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接