我的Laravel设置了一个MultiSite中间件提供程序,它检查地址的子域,并根据此子域将连接即时更改为另一个数据库。
e.g。
Config::set('database.connections.mysql.host', $config['host'] );
Config::set('database.connections.mysql.database', $config['db_name'] );
Config::set('database.connections.mysql.username', $config['user']);
Config::set('database.connections.mysql.password', $config['password']);
Config::set('database.connections.mysql.prefix', $config['prefix']);
Config::set('database.connections.mysql.theme', $config['theme']);
// purge main to prevent issues (and potentially speed up connections??)
DB::disconnect('main');
DB::purge();
DB::reconnect();
return $next($request);
这一切都很棒,除了我现在想要使用内置数据库驱动程序的Laravel Queues(同步实际上工作正常,但阻止了长报告生成的用户体验)。
除非Artisan不确定要连接到哪个数据库,所以我猜测它连接到默认值,这是一种存储所有子域和相应数据库名称等的管理员数据库。
请注意,这些数据库都没有在我的数据库conf中设置为连接,它们存储在一个单一的管理数据库中,因为它们中有很多。
我尝试克隆内置的Queue侦听器并修改它以交换到不同的站点连接,如下所示:
/**
* Create a new queue listen command.
*
* @param \Illuminate\Queue\Listener $listener
* @return void
*/
public function __construct(Listener $listener)
{
// multisite swap
$site = MultiSites::where('machine_name', $this->argument('site'));
MultiSites::changeSite($site->id);
parent::__construct();
$this->setOutputHandler($this->listener = $listener);
}
但是
失败了监听器类缺少$ commandPath参数。
在fire()或handle()方法中尝试类似的数据库/站点交换会停止$ commandPath错误,但它不会执行任何操作,没有反馈,也不会开始处理来自数据库的任何作业。
我不知道如何在多站点环境下工作,有没有人有任何想法,或者我对此有错误的方法?
我理想的情况是能够运行一个单一的队列命令,让主管监控它,并跳过每个数据库检查。但是如果有必要,我也愿意为每个数据库/站点生成一个队列命令。