1. 程式人生 > >Yii2 RabbitMQ 使用詳解

Yii2 RabbitMQ 使用詳解

PHP雖然在普通訊息佇列中表現不算特別好,但是因為其輕便簡單作為客戶端來接收其他語言指令碼處理後的訊息再作為服務端傳給js客戶端也是很常見的,所以PHP訊息佇列的使用還是很重要。

  • 這裡注意的是還有叫yii2-amqp的包,這些直接通過component注入,但是可能會因為版本不同出各種各樣的問題,還有各種各樣的依賴包也可能因為版本出現問題,比如yii2-amqp這個包
requires

php: >=5.3.0
videlalvaro/php-amqplib: 2.4.0
webtoucher/yii2-commands: *
requires (dev)

None
suggests None provides None conflicts None replaces None

需要的幾個依賴包版本都有一點問題,筆者在試驗的時候已經不能正常使用了(也可能是我的姿勢不對),反正直接用原本的那個php-amplib包是更好的,配置也非常的簡單。

  • 可以直接根據github上的README.md來配置,這裡再稍微說一下

$ php composer.phar require php-amqplib/php-amqplib “2.6.*”

安裝好之後我們可以在vendor下找到php-amqplib包。

使用方法

  • 不需要去修改配置資料夾
在要使用佇列的相應控制器下加上
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Connection\AMQPStreamConnection;
  • 接下來建立一個類
class PhpClient {
    private $connection;
    private $channel;
    private $callback_queue;
    private $response;
    private $corr_id;
    private $result = '';

    CONST HOST =
"your_host_ip"; CONST PORT = 5672; //預設5672 CONST USER = "username"; //使用者名稱 CONST PASS = "password";//密碼 public function __construct() { $this->connection = new AMQPStreamConnection( self::HOST, self::PORT, self::USER, self::PASS); //建立連線 $this->channel = $this->connection->channel(); list($this->callback_queue, ,) = $this->channel->queue_declare( "", false, false, true, false); $this->channel->basic_consume( $this->callback_queue, '', false, false, false, false, array($this, 'on_response')); } public function on_response($rep) { if($rep->get('correlation_id') == $this->corr_id) { $this->result .= $rep->body; $this->response = $rep->body; } } public function call($n) { $this->response = null; $this->corr_id = uniqid(); $msg = new AMQPMessage( (string) $n, array('correlation_id' => $this->corr_id, 'reply_to' => $this->callback_queue) ); $this->channel->basic_publish($msg, '', 'queue'); //這裡的queue是訊息名稱 while($this->response != "end") { $this->channel->wait(); } return $this->result; } }
  • 在控制器中呼叫這個類
$client = new PhpClient();
$responses = $client->call('information'); //在這裡傳入傳送給服務端指令碼的內容

這樣就可以很簡單的實現訊息隊列了,封裝好的方法有興趣的可以自行檢視原始碼

                                                    --by vampirebitter