【问题标题】:What is the best way to run a Laravel Scheduled Task over multiple databases?在多个数据库上运行 Laravel 计划任务的最佳方法是什么?
【发布时间】:2019-06-27 19:01:18
【问题描述】:
我有一个 laravel 网络应用程序,其中每个客户端都有自己的数据库。所有数据库连接都定义为 config/database.php 中的连接。我根据请求来自的子域连接到适当的数据库。
现在,我需要在每个午夜运行一些清洁任务。我创建了一个命令来完成该任务,它适用于 laravel 应用程序当前在 .env 文件中配置的默认数据库。但是,为所有客户端数据库迭代此任务的最佳方法是什么?
【问题讨论】:
标签:
php
laravel
scheduled-tasks
【解决方案1】:
使用 Laravel 的 Config 类很容易实现。我在连接多个 MySQL 服务器和多个数据库以从服务器获取一些信息时遇到了同样的问题。而且我必须处理未定义数量的服务器。所以我找到了一个对你也有用的通用解决方案!
为您的命令的 Handle() 函数考虑这种结构:
public function handle()
{
$arrayOfConnections = config('database.connections'); // Array of connections
foreach($arrayOfConnections as $connection){
// Setting Config
Config::set('database.connections.dynamicConnection.host',$connection->host);
Config::set('database.connections.dynamicConnection.password',$connection->connection);
// More of your config
// Your Logic Here
// Purge the configuration (It is important!)
DB::purge('dynamicConnection');
}
}
当然,您必须从数组中排除dynamicConnection,这需要一个三元运算符或一个条件。但这就是我的做法。我的不完全一样,我从数据库中获取值,因为每隔几分钟更新一次配置文件不好,而且在配置文件中包含数百台服务器的信息也不好。但这对您有用(将此代码视为逻辑,而不是魔术,无需编辑即可针对您的特定情况开箱即用)