Sử dụng RabbitMQ trong PHP
Tác giả: Lợi NV Trong hướng dẫn này, tôi sẽ hướng dẫn bạn cách sử dụng RabbitMQ trong PHP. Nhưng trước tiên RabbitMQ là gì? RabbitMQ là một phần mềm môi giới thông điệp. Nó hoạt động như một người trung gian giữa producer và consumer. Producer là dữ liệu mà chúng tôi muốn vượt qua và người ...
Tác giả: Lợi NV
Trong hướng dẫn này, tôi sẽ hướng dẫn bạn cách sử dụng RabbitMQ trong PHP. Nhưng trước tiên RabbitMQ là gì? RabbitMQ là một phần mềm môi giới thông điệp. Nó hoạt động như một người trung gian giữa producer và consumer. Producer là dữ liệu mà chúng tôi muốn vượt qua và người tiêu dùng là thực thể mà chúng tôi muốn truyền cho họ. RabbitMQ sử dụng hàng đợi, bạn có thể coi nó như một hộp thư nơi bạn thả các bức thư của mình. RabbitMQ sau đó lấy các bức thư và đưa nó đến đích của nó.
Cài đặt RabbitMQ
Trong Ubuntu và hệ điều hành debian khác, bạn có thể cài đặt RabbitMQ bằng cách thực hiện các lệnh sau trên terminal của bạn:
1 2 3 4 5 6 7 8 9 10 |
echo "deb http://www.rabbitmq.com/debian/ testing main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list > /dev/null sudo wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc sudo apt-key add rabbitmq-signing-key-public.asc sudo apt-get update sudo apt-get install rabbitmq-server -y sudo service rabbitmq-server start sudo rabbitmq-plugins enable rabbitmq_management sudo service rabbitmq-server restart |
Lệnh đầu tiên là nối thêm nguồn rabbitmq vào danh sách nguồn phần mềm. Tiếp theo, chúng ta tải về khóa đăng ký rabbitmq bằng wget . Sau đó thêm khóa vào Ubuntu. Tiếp theo chúng ta gọi apt-get update để cập nhật danh sách các nguồn phần mềm. Tiếp theo, chúng ta cài đặt máy chủ RabbitMQ, khởi động nó sau đó kích hoạt plugin quản lý RabbitMQ. Điều này cung cấp quản lý API dựa trên HTTP để theo dõi máy chủ RabbitMQ của bạn. Cuối cùng, chúng ta khởi động lại máy chủ RabbitMQ để thay đổi sẽ có hiệu lực. Tên người dùng và mật khẩu mặc định là guest . Và cổng mặc định trong đó nó chạy là 5672 .
Nếu bạn đang sử dụng hệ điều hành khác, bạn có thể tìm cách cài đặt RabbitMQ cho hệ điều hành cụ thể của bạn tại đây: http://www.rabbitmq.com/download.html .
Làm việc với RabbitMQ
Khi bạn đã cài đặt xong RabbitMQ, chúng ta có thể cài đặt thư viện AMQP cho PHP. Điều này thực hiện giao thức AMQP (Giao thức hàng đợi thông điệp nâng cao). Như tên cho thấy nó là một giao thức được sử dụng để gửi thông điệp. Bắt đầu bằng cách tạo một danh mục mới, đây là nơi chúng tôi sẽ đặt tất cả các tệp để thử nghiệm RabbitMQ. Tiếp theo, tạo một tệp composer.json và thêm các phần sau:
1 2 3 4 5 6 7 |
{ "require": { "videlalvaro/php-amqplib": "2.2.*" } } |
Tiếp theo, mở terminal và cd của bạn vào thư mục bạn đã tạo trước đó, sau đó thực hiện composer install để cài đặt thư viện AMQP.
Trước khi chúng ta tiếp tục, hãy cài đặt Swiftmailer . Bạn có thể làm điều đó bằng cách thực hiện lệnh sau từ terminal của bạn. Thao tác này cũng thêm mục nhập vào Swiftmailer vào composer.json của bạn:
1 2 3 |
composer require swiftmailer/swiftmailer @stable |
Gửi thông điệp
Đầu tiên cho phép tạo biểu mẫu được sử dụng để gửi email. Điều này sẽ chấp nhận tên và địa chỉ email của người gửi, địa chỉ email của người nhận và sau đó là chủ đề và thông điệp. Đặt tên cho tệp form.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php if(!empty($_GET['sent'])){ ?> <div> Your message was sent! </div> <?php } ?> <form action="mailer.php" method="POST"> <div> <label for="from">From</label> <input type="text" name="from" id="from"> </div> <div> <label for="from_email">From Email</label> <input type="text" name="from_email" id="from_email"> </div> <div> <label for="to_email">To Email</label> <input type="text" name="to_email" id="to_email"> </div> <div> <label for="subject">Subject</label> <input type="text" name="subject" id="subject"> </div> <div> <label for="message">Message</label> <textarea name="message" id="message" cols="30" rows="10"></textarea> </div> <div> <button type="submit">Send</button> </div> </form> |
Tiếp theo, tạo tệp sẽ đẩy thư vào hàng đợi. Đặt tên cho tệp tin sender.php . Yêu cầu tệp autoload.php để các phụ thuộc của chúng sẽ được tự động tải bởi PHP. Sau đó sử dụng AMQPConnection và AMQPMessage từ thư viện AMQP. AMQPConnection cho phép chúng ta tạo một kết nối mới đến máy chủ RabbitMQ và AMQPMessage cho phép chúng ta tạo các thông điệp mà chúng ta có thể đẩy vào hàng đợi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLibConnectionAMQPConnection; use PhpAmqpLibMessageAMQPMessage; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('email_queue', false, false, false, false); $data = json_encode($_POST); $msg = new AMQPMessage($data, array('delivery_mode' => 2)); $channel->basic_publish($msg, ', 'email_queue'); header('Location: form.php?sent=true'); ?> |
Chia nhỏ nó, trước tiên chúng ta tạo một kết nối mới bằng cách tạo một thể hiện mới của lớp AMQPConnection . Điều này đòi hỏi các đối số sau đây:
- host – máy chủ mà máy chủ RabbitMQ đang chạy. Trong trường hợp này, chúng ta đã cài đặt RabbitMQ trên cùng một máy tính, chúng ta đang chạy tập lệnh. Vì vậy, nó phải là localhost . Lưu ý rằng trong thế giới thực, chúng ta cài đặt RabbitMQ trên một máy chủ khác, khác với máy chủ đang sử dụng để phục vụ trang web của chúng ta. Vì vậy, thay vì localhost chúng ta sử dụng địa chỉ IP công cộng của máy chủ đó.
- port – cổng mà máy chủ RabbitMQ đang chạy.
- user – tên người dùng để sử dụng để đăng nhập vào máy chủ. Theo mặc định, tên người dùng được đặt thành guest .
- password – mật khẩu của người dùng. Theo mặc định, mật khẩu được đặt thành guest .
Tiếp theo chúng ta tạo một kênh. Chúng ta có thể làm điều đó bằng cách gọi phương thức channel() từ kết nối mà chúng ta vừa khai báo.
1 2 3 4 5 |
<?php $channel = $connection->channel(); ?> |
Tiếp theo, chúng ta khai báo hàng đợi sẽ được sử dụng bằng cách gọi phương thức queue_declare.
1 2 3 4 5 |
<?php $channel->queue_declare('email_queue', false, false, false, false); ?> |
Phương thức queue_declare chiếm các đối số sau:
- queue name – tên mà bạn muốn sử dụng cho hàng đợi, bạn có thể cung cấp bất kỳ thứ gì cho điều này.
- passive – một giá trị boolean để xác định xem có nên kiểm tra một trao đổi hiện có hay không.
- durable – một giá trị boolean để xác định xem RabbitMQ giữ trên một hàng đợi khi máy chủ bị treo.
- exclusive – một giá trị boolean để xác định xem hàng đợi có được sử dụng bởi chỉ một kết nối hay không.
- auto-delete – giá trị boolean để xác định xem hàng đợi có bị xóa khi người đăng ký hủy đăng ký cuối cùng hay không.
Tiếp theo, chúng ta chuyển đổi dữ liệu POST mà chúng tôi nhận được từ biểu mẫu thành chuỗi JSON. Chúng ta chỉ có thể truyền các chuỗi như một thông báo, vì vậy chúng ta sẽ phải chuyển đổi chuỗi này sau này thành một mảng trên đầu của người nhận.
1 2 3 4 5 |
<?php $data = json_encode($_POST); ?> |
Tiếp theo chúng ta tạo một tin nhắn mới. Điều này chấp nhận 2 đối số: dữ liệu và một loạt các tùy chọn. Đối với mảng các tùy chọn, chúng tôi chỉ định delivery_mode là 2 có nghĩa là thông báo vẫn tồn tại. Điều này có nghĩa là nó không bị mất khi máy chủ bị lỗi hoặc xảy ra lỗi.
1 2 3 4 5 |
<?php $msg = new AMQPMessage($data, array('delivery_mode' => 2)); ?> |
Tiếp theo, chúng ta xuất bản thông điệp bằng cách gọi phương thức basic_publish() trên kênh. Điều này chấp nhận 3 đối số: thông điệp, trao đổi và tên của hàng đợi. Nếu bạn đang tự hỏi tại sao chúng ta đặt giá trị trao đổi thành một chuỗi rỗng, đó là bởi vì chúng ta không thực sự cần nó. Việc trao đổi thường được sử dụng cho các mẫu pub-sub. Những gì đang sử dụng ở đây chỉ là xuất bản cơ bản.
1 2 3 4 5 |
<?php $channel->basic_publish($msg, ', 'email_queue'); ?> |
Cuối cùng, chúng tôi chỉ chuyển hướng người dùng đến biểu mẫu.
1 2 3 4 5 |
<?php header('Location: form.php?sent=true'); ?> |
Nhận thông điệp
Bây giờ đã sẵn sàng để viết lệnh sẽ nhận được các thông điệp được gửi bởi người dùng. Đặt tên cho tệp tin là file receiver.php. Đây là nội dung đầy đủ của tệp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLibConnectionAMQPConnection; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('email_queue', false, false, false, false); echo ' * Waiting for messages. To exit press CTRL+C', "
"; $callback = function($msg){ echo " * Message received", "
"; $data = json_decode($msg->body, true); $from = $data['from']; $from_email = $data['from_email']; $to_email = $data['to_email']; $subject = $data['subject']; $message = $data['message']; $transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl') ->setUsername('YOUR_GMAIL_EMAIL') ->setPassword('YOUR_GMAIL_PASSWORD'); $mailer = Swift_Mailer::newInstance($transporter); $message = Swift_Message::newInstance($transporter) ->setSubject($subject) ->setFrom(array($from_email => $from)) ->setTo(array($to_email)) ->setBody($message); $mailer->send($message); echo " * Message was sent", "
"; $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); }; $channel->basic_qos(null, 1, null); $channel->basic_consume('email_queue', ', false, false, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } ?> |
Chia nhỏ nó, 5 dòng mã đầu tiên về cơ bản giống với dòng chúng ta có trong tệp sender.php. Sau đó, chúng ta chỉ xuất một thông báo cho biết cách chúng ta có thể ngừng chạy tệp. Chúng ta cần chạy file này từ terminal để dừng nó, chúng ta chỉ cần nhấn CTRL + C.
Tiếp theo, chúng ta khai báo một hàm được đặt tên. Điều này sẽ được sử dụng để xử lý thông điệp mà chúng ta đã chuyển từ người gửi. Điều đầu tiên nó làm là đầu ra tin nhắn đã được nhận. Sau đó, chúng ta sử dụng json_decode() để chuyển đổi chuỗi JSON trở lại một mảng.