1

我正在尝试使用 Symfony Messenger 组件使用具有相同 Redis 传输的多个消费者。正如 Symfony 指南中提到的,如果我们对流/组/信使使用相同的值,我们可能会遇到问题,因为相同的消息可以被多个消费者处理。所以我更新了我的主管配置如下:

environment=MESSENGER_CONSUMER_NAME=%(program_name)s_%(process_num)02d

然后,我更新了我的 messenger.yaml 文件,如下所示:

redis: 
    dsn: '%env(MESSENGER_TRANSPORT_REDIS)%'
    options:
        consumer: '%env(MESSENGER_CONSUMER_NAME)%'

我已经重新加载了主管:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start messenger-consume:*

但我仍然收到错误:

[2021-12-25T18:33:08.954217+01:00] console.CRITICAL: Error thrown while running command "messenger-dispatcher --count=100". Message: "Environment variable not found: "MESSENGER_CONSUMER_NAME"." {"exception":"[object] (Symfony\\Component\\DependencyInjection\\Exception\\EnvNotFoundException(code: 0): Environment variable not found: \"MESSENGER_CONSUMER_NAME\". at /var/www/vendor/symfony/dependency-injection/EnvVarProcessor.php:172)","command":"messenger-dispatcher --count=100","message":"Environment variable not found: \"MESSENGER_CONSUMER_NAME\"."} []

我遵循了指导方针,但某处缺少一些东西……但是在哪里?为什么我的应用程序不读取 env var?

如果我打电话给我的消费者:

MESSENGER_CONSUMER_NAME=myconsumer ./bin/console messenger:consume redis

它按预期工作;它不仅适用于主管 var。

提前致谢

更新这是我的主管文件的完整部分配置:

[program:consumer-redis]
command=php /var/www/bin/console messenger:consume redis --limit=5 --time-limit=3600
user=root
numprocs=6
startsecs=0
autostart=true
autorestart=true
process_name=%(program_name)s_%(process_num)02d
environment=MESSENGER_CONSUMER_NAME=%(program_name)s_%(process_num)02d
4

2 回答 2

0

今天我遇到了类似的问题,但是如果我的答案与您的问题相匹配,您需要再解释一下,否则请重播我以删除我的答案。

所以问题是,当你运行命令时:

php /var/www/bin/console messenger:consume redis

Symfony 假设 APP_ENV 来自 2 个部分,如果您使用的是 Web 服务器,则该变量取自 apache 或 nginx 或 php/apache.conf 文件配置,但在命令行中,如果您的服务器没有配置变量 APP_ENV,则 symfony 是将检查 .env 文件,然后检查 .env.local 或 .env.local.php,因此,如果该变量不存在,Symfony 不会获取任何文件,如 .env.prod.local 或 .env。 prod 因为缺少该变量。如果您正在使用

于 2022-01-03T06:57:01.010 回答
0

感谢这篇文章,我找到了答案。

你的配置很好。你只需要添加一个具有默认值的环境变量,这样 Symfony 就不会产生错误:

# .env.local
MESSENGER_CONSUMER_NAME=0

此环境变量将在主管运行的进程中被覆盖。为了测试它,我只需登录$_ENV['MESSENGER_CONSUMER_NAME']一个函数。这是我调用它时得到的:

  • 不使用 Messenger (同步)0
  • 使用 Messenger:messenger-consume_00messenger-consume_01(在我的配置中我有 numprocs=2)
于 2022-02-01T00:46:36.753 回答