2013-12-18 48 views
11

我有下面安裝了芹菜和RabbitMQ的版本 -如何在PHP中的celery-rabbitmq隊列上發佈任務?

芹菜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)); 

我的工人模塊是蟒蛇 -

# tasks.py 
from celery import Celery 
celery = Celery('tasks', broker='amqp://guest:[email protected]: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代碼在默認隊列上發佈任務:celery(顯然不在演示隊列)。

如何在PHP中的特定隊列上發佈我的任務?請幫忙。

+0

我想我會去有不同的任務,而不是不同的隊列,如果上面的東西不是不可能性。 – Hussain

+0

你應該檢查celery-php的源代碼,看看是否有辦法指定任務的'exchange'和'routing_key'。在amqp中,您不會將消息發送到隊列,而是將它們發送給交換機,然後通過匹配routing_key將消息傳遞到隊列。有一個技巧:你可以將'exchange =「」'和routing_key設置爲一個隊列的名字(例如'routing_key =「demo」',它會直接將消息傳遞給演示隊列,繞過路由選擇層。 – asksol

+0

I我不太熟悉amqp,我會詳細介紹一下芹菜-php的源代碼,然後嘗試一下上面的內容,我會告訴你的,謝謝你的回覆。 – Hussain

回答

4

默認情況下,您的用於Celery的PHP客戶端將隊列名稱作爲「芹菜」。

爲了更改要發佈到的隊列,必須在實例化與Celery的連接時指定隊列名稱。 所以,如果你正着手與「-Q演示」選項,你的芹菜工人,然後在你的PHP芹菜連接應該是 -

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

注意:使用-Q選項,交流和routing_key值是一樣的queue_name。

請試試這個,並分享結果。

關於交換和綁定

用比喻電話服務,Exchange是像「電話運營商」,其唯一的工作就是「直接調用YOU」與routing_key的幫助。

綁定是「您的電話號碼」,它充當您的電話的路由鍵。

注意:此過程中交換根據綁定(routing_key)將傳入消息重定向到隊列,是DIRECT交換類型。 AMQP幾乎沒有其他類型的交換,您可以在AMQP文檔中閱讀。

您也可以參考這個Celery page