Laravel多个应用程序相同的服务器队列冲突,如果相同的名称?

时间:2018-01-15 04:59:37

标签: php laravel laravel-5 supervisor

我们目前在同一台专用服务器上运行两个laravel应用程序。每个应用程序都使用laravel的排队系统进行后台作业和通知。每个都使用redis作为驱动程序。既没有定义任何特定队列,它们都使用默认值。我们的主管.conf如下:

[program:site-one-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/siteone.com/artisan queue:work --sleep=5 --tries=1
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/siteone.com/storage/logs/worker.log

[program:site-two-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/sitetwo.com/artisan queue:work --sleep=5 --tries=1
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/sitetwo.com/storage/logs/worker.log

在添加第二个站点的配置之前,一切都按预期工作。添加之后,我们进行了测试,发现当在sitetwo.com上调用触发通知发送到队列的事件时,应该收到通知的电子邮件地址没有,而是发送到两封电子邮件仅存在于siteone.com数据库中的地址!

只要上述监督工作中只有一个正在运行,一切似乎都按预期运行。

使用相同的队列名进行处理的两个不同应用程序之间是否存在冲突?我是否破坏了主管配置?还有其他我在这里失踪的东西吗?

3 个答案:

答案 0 :(得分:1)

该类的名称是Laravel在阅读队列时所关心的。因此,如果您有2个站点调度作业App\Jobs\CoolEmailSender,那么无论哪个应用程序首先选择它,都会处理它,无论是哪个调用它。

我可以在这里想到两件事:

  1. 多个redis-instances
    1. 传递给--queue
    2. 的唯一队列名称

答案 1 :(得分:0)

也许晚了,但是您是否尝试在config / queue.php上修改队列配置

'redis' => [
    'driver' => 'redis',
    'connection' => 'default',
    'queue' => 'project1', // 'project2'...
    'retry_after' => 90,
    'block_for' => null,
],

使用--queue=project1

运行队列

答案 2 :(得分:0)

我刚刚将 APP_ENV 和 APP_NAME 更改为 .env 文件,它对我有用。

例如:

  • 第一个 .env:APP_ENV=local APP_NAME = localapp
  • 第二个 .env:APP_ENV=staging APP_NAME=stagingapp