Laravel 5.4 MultiSite,每个站点都有队列

时间:2017-08-03 09:03:04

标签: php laravel laravel-5.4 laravel-queue

我的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错误,但它不会执行任何操作,没有反馈,也不会开始处理来自数据库的任何作业。

我不知道如何在多站点环境下工作,有没有人有任何想法,或者我对此有错误的方法?

我理想的情况是能够运行一个单一的队列命令,让主管监控它,并跳过每个数据库检查。但是如果有必要,我也愿意为每个数据库/站点生成一个队列命令。

0 个答案:

没有答案