当前位置: 首页 > 知识库问答 >
问题:

如何在PHP中在芹菜rabbitmq队列上发布任务?

荣俊杰
2023-03-14

我已经安装了以下版本的芹菜和拉比MQ-

芹菜3.1。6
rabbitmq 3.1。1.

我可以从PHP向默认队列发布任务-

//client.php
<?php
require 'celery-php/celery.php';
$c = new Celery('localhost', 'guest', 'guest', '/');
$result = $c->PostTask('tasks.add', array(2,2));

我的worker模块是用python编写的-

# tasks.py
from celery import Celery
celery = Celery('tasks', broker='amqp://guest:guest@localhost:5672//')
@celery.task(queue='demo', name='add')
def add(x, y):
    return x + y

我像这样管理芹菜工人和客户-

# terminal window 1
$ celery -A tasks worker --loglevel=info
# terminal window 2
$ php -f client.php

这很有效。我在终端窗口1中看到以下输出:

Received task: tasks.add[php_52b1759141a8b3.43107845]
Task tasks.add[php_52b1759141a8b3.43107845] succeeded in 0.000701383920386s: 4

但是我想要不同的队列。为了演示,假设我只需要一个名为demo的队列。所以我像这样管理我的芹菜工人-

$ celery -A tasks worker --loglevel=info -Q demo

但它不起作用。任务未得到执行。我猜这可能是因为PHP代码将任务发布在默认队列:芹菜(显然不在演示队列)上。

如何在PHP中将任务发布到特定队列上?请帮忙。

共有1个答案

越飞鸾
2023-03-14

默认情况下,芹菜PHP客户端将队列名称作为“芹菜”。

要更改要发布到的队列,必须在实例化芹菜连接时指定队列名称。因此,如果您使用“-qdemo”选项启动芹菜工人,那么您在PHP中与芹菜的连接应该是-

$exchange = 'demo'; 
$binding = 'demo'; 
$c = new Celery('localhost', 'guest', 'guest', '/', $exchange, $binding); 

注意:使用-Q选项,交换和routing_key值与queue_name相同。

请尝试并分享结果。

关于交换和绑定:

与电话服务类似,交换机就像“电话接线员”,其唯一的工作就是在路由键的帮助下“直接给您打电话”。

然后绑定为“您的电话号码”,它充当您电话的路由密钥。

注意:exchange根据绑定(路由密钥)将传入消息重定向到队列的过程是直接exchange类型。AMQP几乎没有其他类型的交换,您可以在AMQP文档中阅读。

你也可以参考这个芹菜页面

 类似资料:
  • 问题内容: 如何在Windows中运行celery worker而不创建Windows Service?有什么比喻吗? 问题答案: 它的完成方式与Linux中相同。将目录更改为包含celery任务的模块并调用效果很好。

  • 问题内容: 我是Celery的新手,这是我的问题: 假设我有一个脚本,该脚本经常应该从数据库中获取新数据并将其发送给使用Celery的工作人员。 task.py fetch_db.py 我担心的是:每30秒获取一次数据。process_data()函数可能需要更长的时间,并且根据工作人员的数量(尤其是如果数量太少),据我所知,队列可能会受到限制。 我不能增加工人的数量。 我可以修改代码,以免在队列

  • 我正在尝试设置到系统中所有节点的广播消息。当一个新节点加入系统时,它会向其他所有节点发布一条消息来宣布它的加入。我设计的方式是,存在一个交换,所有节点都将绑定到它自己的队列。每当一个新节点加入系统时,它就会将其队列绑定到exchange并将消息发布到exchange。所有节点都会收到这个消息(包括自身),所有其他节点(除了这个消息)都会发送一个“ACK”消息,这样新节点就会了解系统中可用的节点。但

  • 一种方法是声明队列并将消息发布到该队列,并让所有使用者从该队列中消费。这将在不同的消费者之间分发消息。 我不清楚,如果上面的操作是正确的,或者最佳实践是将消息传递到Exchange而不是直接发布到队列。使用Exchange时,我必须确保在生产者创建Exchange之后声明队列,然后才开始发布消息。否则,没有队列接收到消息,并且消息将丢失。

  • 在我的python应用程序中,我使用芹菜作为任务生产者和消费者,使用RabbitMQ作为代理。现在,我正在实施优先级排序。起初,它看起来根本不起作用,因为根据文档,我刚刚在队列中添加了参数。我更深入地研究了一下,发现了另一种优先级——消费者优先级和任务优先级。所以,现在,看起来有三种不同的优先顺序,我完全困惑了。你能给我解释一下区别吗? 队列最大优先级:即https://www.rabbitmq.

  • 问题内容: 我需要一个可以在重新启动的RabbitMQ服务器交换上发现队列的python客户端,然后启动一个客户端以继续使用每个队列中的消息。如何从某些RabbitMQ兼容的python api /库中发现队列? 问题答案: 据我所知,没有任何办法可以做到这一点。这与Python无关,但是因为AMQP没有定义任何队列发现方法。 无论如何,在AMQP中,都是由客户端(消费者)声明队列的:发布者使用路