PHP AMQP文檔說明
無論從數據傳輸或計算效率方面來說,本文將通過闡述php amqp,來看其如何更好地解決這些問題。
起步
channel();
此處我們可以看到,在我們使用php amqp前,我們首先需要安裝PhpAmqpLib。安裝之后,以代碼化方式即可登陸 message queue。
工作隊列
這里,我們將會舉一反三。 假設有一個后臺耗時任務,這個任務將會把文件中URL轉換成PDF,我們可以通過以下方式進行解決:
queue_declare('task_queue', false, true, false, false); $msg = new AMQPMessage($url); $channel->basic_publish($msg, '', 'task_queue'); echo " [x] Sent ", $url, "\n";
這里我們可以通過channel的基本參數,以basic_publish
的方式進行文件的發布。同時,我們注意到“task_queue”是一個持久化的隊列,這樣一來,即使RabbitMQ服務器關閉或重啟,其仍然會保留受到的消息。
發布者/訂閱者
現在,假設我們需要通過訂閱的方式來獲取pdf文件。則可以通過以下代碼進行解決:
exchange_declare('pdfs', 'fanout', false, false, false); list($queue_name, ,) = $channel->queue_declare('', false, false, true, false); $channel->queue_bind($queue_name, 'pdfs'); echo ' [*] Waiting for logs. To exit press CTRL+C', "\n"; $callback = function ($msg) { echo ' [x] ', $msg->body, "\n"; }; $channel->basic_consume($queue_name, '', false, true, false, false, $callback); while (count($channel->callbacks)) { $channel->wait(); }
這里通過通過queue_bind
來講隊列和模式綁定起來。同時,配置訂閱者,以此迭代的方式,來開辟文件下載服務。當然,這里也僅僅是展示出關注于如何使用php amqp, 在實際中應用這些思維,還需要根據自己的實際需要去考慮使用。
總結
在此之上,我們可以看出,php amqp依賴于消息隊列的一種高效的機制,同時以消息的方式提高了系統的可用性(并發)。但同時,因為使用了消息隊列,一般會在保證處理單元之間獨立性的同時,增加了系統整體的耦合。在使用消息隊列之前,一定需要好好考慮其應用場合,才能充分發揮php amqp的作用。