同一服务器上具有不同环境(Laravel Forge)的多个队列

时间:2019-10-02 09:43:59

标签: php laravel queue laravel-forge

我真的很困惑,如果您能提供一些帮助,我会很高兴。

我所拥有的:

1)Laravel Forge与单个服务器。

2)那里有两个站点(分期和生产)

3)为每个队列设置1个队列(在FORGE上进行生产和生产)

问题: 我有通过队列生成的pdf。看起来即使队列是从登台代码执行的,但有时生产站点的队列也会运行。看了很多书后,我总结出它们彼此混乱,因为它们位于同一台服务器上。所以这就是我所做的。这是config / queue.php。

'database' => [
     'driver' => 'database',
     'table' => 'jobs',
     'queue'  => env('QUEUE_NAME', 'default'), // i made this instead of default as it was
     'retry_after' => 90,
],

此后,由于我有不同的环境文件用于暂存和生产,因此我在其中放置了不同的QUEUE_NAME值。比方说.staging.env QUEUE_NAME=staging.prod.env QUEUE_NAME=production

然后,我移至My Laravel Forge的登台站点,添加了这样的队列:

Connection: database
Queue: staging

我还搬到了My Laravel Forge的产品站点,添加了一个队列,但又添加了一个队列。

Connection: database
Queue: production

毕竟,问题似乎已经消失了。

问题1):您认为我所做的是正确的,最重要的是,足够了,这样我的问题再也不会出现了吗?

问题2),用于登台站点和生产站点的部署脚本的末尾都有php artisan queue:restart。我认为,如果我将某些内容上传到登台服务器并且该行被执行,那么它也将重新启动生产队列。这看起来真的很糟糕。我找不到任何可以通过参数重新启动的内容,例如:

php artisan queue:restart --queue=staging

1 个答案:

答案 0 :(得分:0)

我认为您的解决方案有效,但是更好的解决方案是确保它们没有使用相同的数据存储。

对于每个队列驱动程序,Laravel存储挂起的作业,已完成的作业和失败的作业。前两个的位置取决于驱动程序,而最后一个始终存储在数据库中。例如,对于database驱动程序,挂起和完成的作业存储在数据库中。对于redis驱动程序,它们存储在Redis中。

这意味着,如果可以确保应用程序的每个实例都使用不同的数据库(即使它们在同一安装中),那么您应该一切顺利!例如(假设您正在使用共享实例):

  • 如果您的数据库实例是MySQL,则可以为每个环境创建一个不同的数据库,并将其设置为DB_NAME
  • 如果您的数据库实例是SQLite,则为每个数据库实例创建一个不同的数据库文件并将其放置在database/文件夹中,然后将路径名设置为DB_NAME
  • 如果您的队列驱动程序是redis,请针对不同的环境将REDIS_DB的值(0到15之间的数字)设置为不同的值。