我真的很困惑,如果您能提供一些帮助,我会很高兴。
我所拥有的:
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
答案 0 :(得分:0)
我认为您的解决方案有效,但是更好的解决方案是确保它们没有使用相同的数据存储。
对于每个队列驱动程序,Laravel存储挂起的作业,已完成的作业和失败的作业。前两个的位置取决于驱动程序,而最后一个始终存储在数据库中。例如,对于database
驱动程序,挂起和完成的作业存储在数据库中。对于redis
驱动程序,它们存储在Redis中。
这意味着,如果可以确保应用程序的每个实例都使用不同的数据库(即使它们在同一安装中),那么您应该一切顺利!例如(假设您正在使用共享实例):
DB_NAME
。database/
文件夹中,然后将路径名设置为DB_NAME
redis
,请针对不同的环境将REDIS_DB的值(0到15之间的数字)设置为不同的值。