2013-12-18 24 views
11

Tôi có dưới phiên bản của cần tây và RabbitMQ cài đặt -Làm thế nào để đăng một nhiệm vụ trên hàng đợi cần tây-thỏmq trong PHP?

cần tây 3.1.6
RabbitMQ 3.1.1

tôi có thể gửi một nhiệm vụ vào hàng đợi mặc định từ PHP -

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

Mô-đun công nhân của tôi ở dạng python -

# 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 

tôi chạy người lao động cần tây và khách hàng như thế này -

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

này hoạt động. Tôi thấy sản lượng dưới đây trong cửa sổ đầu cuối 1:

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

Nhưng tôi muốn có hàng đợi khác nhau. Đối với một cuộc biểu tình, giả sử tôi chỉ muốn một hàng đợi có tên là demo. Vì vậy, tôi điều hành công nhân cần tây của mình như thế này -

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

Nhưng nó không hoạt động. Nhiệm vụ không được thực hiện. Tôi đoán có thể là do mã PHP đang đăng tác vụ trên hàng đợi mặc định: cần tây (dường như không phải trên bản giới thiệu hàng đợi).

Làm cách nào để đăng tác vụ của mình lên hàng đợi cụ thể trong PHP? Hãy giúp tôi.

+0

Tôi đoán tôi sẽ thực hiện các tác vụ khác nhau thay vì hàng đợi khác nhau nếu điều trên không thể có. – Hussain

+0

Bạn nên kiểm tra mã nguồn của celery-php để xem có cách nào để chỉ định 'exchange' và' routing_key' của tác vụ hay không. Trong amqp bạn không gửi tin nhắn đến hàng đợi, bạn gửi chúng đến các trao đổi mà sau đó sẽ gửi tin nhắn đến hàng đợi bằng cách khớp với routing_key. Có một thủ thuật: bạn có thể đặt 'exchange =" "' và routing_key thành tên của hàng đợi (ví dụ 'routing_key =" demo "' và nó sẽ gửi thông điệp trực tiếp đến hàng đợi demo, bỏ qua lớp định tuyến. – asksol

+0

I Tôi không hiểu rõ về amqp.Tôi sẽ tìm hiểu kỹ mã nguồn của celery-php và thử những thứ trên Tôi sẽ cho bạn biết về nó. – Hussain

Trả lời

4

Theo mặc định, ứng dụng khách PHP của bạn cho Celery lấy tên hàng đợi là "cần tây".

Để thay đổi hàng đợi để xuất bản, bạn phải chỉ định tên hàng đợi trong khi khởi tạo kết nối với Celery. Vì vậy, nếu bạn đang bắt đầu lao động cần tây của bạn với "-Q bản demo" tùy chọn, sau đó kết nối của bạn để cần tây trong PHP nên -

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

Lưu ý: Với -Q, việc trao đổi và giá trị so routing_key là giống như queue_name.

Hãy thử điều này và chia sẻ kết quả.

Về trao đổi và ràng buộc:

Với tương tự với dịch vụ điện thoại, trao đổi cũng giống như "Telephone Operator", mà công việc duy nhất là "Chỉ đạo các cuộc gọi đến BẠN" với sự giúp đỡ của routing_key.

Ràng buộc sau đó là "Số điện thoại của bạn", hoạt động như routing_key đến điện thoại của bạn.

Lưu ý: Quá trình trao đổi này chuyển hướng thư đến đến hàng đợi dựa trên ràng buộc (routing_key), là loại trao đổi TRỰC TIẾP. AMQP có vài loại trao đổi khác mà bạn có thể đọc trong tài liệu AMQP.

Bạn cũng có thể tham chiếu này Celery page

Các vấn đề liên quan