Linux教程之ubuntu下手動編譯php-amqp擴充教程
首先,神馬是amqp?介紹在這裡,簡單的講就是進階隊列協議。而這個擴充就是為了讓php可以支援amqp協議與相關的隊列服務通訊。
優點:可以解決伺服器處理的並發問題。
進階訊息隊列協議(AMQP)是一個非同步訊息傳遞所使用的應用程式層協議規範。作為線路層協議,而不是API(例如JMS),AMQP 用戶端能夠無視訊息的來源任意發送和接受資訊。現在,已經有相當一部分不同平台的伺服器和用戶端可以投入使用。
(一)基本概念
RabbitMQ 是流行的開源訊息隊列系統,用erlang語言開發。RabbitMQ是AMQP(進階訊息隊列協 議)的標準實現。如果不熟悉AMQP,直接看RabbitMQ的文檔會比較困難。不過它也只有幾個關鍵概念,這裡簡單介紹。
幾個概念說明:
- Broker:簡單來說就是訊息隊列伺服器實體。
- Exchange:訊息交換器,它指定訊息按什麼規則,路由到哪個隊列。
- Queue:訊息隊列載體,每個訊息都會被投入到一個或多個隊列。
- Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
- Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
- vhost:虛擬機器主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。
- producer:訊息生產者,就是投遞訊息的程式。
- consumer:訊息消費者,就是接受訊息的程式。
- channel:訊息通道,在用戶端的每個串連裡,可建立多個channel,每個channel代表一個會話任務。
(二)使用流程
即 Client - AMQP server - Client
左邊的Client向右邊的Client發送訊息,流程:
- 擷取Conection
- 擷取Channel
- 定義Exchange,Queue
- 使用一個RoutingKey將Queue Binding到一個Exchange上
- 通過指定一個Exchange和一個RoutingKey來將訊息發送到對應的Queue上,
- 接收方在接收時也是擷取connection,接著擷取channel,然後指定一個Queue直接到它關心的Queue上取訊息,它對Exchange,RoutingKey及如何binding都不關心,到對應的Queue上去取訊息就OK了
由於ubuntu的預設源裡面沒有php5-amqp這個包,所以要用上amqp得考手動編譯。
準備工作:
安裝php編譯工具
sudo apt-get install php5-dev
安裝rabbitmq的庫
sudo apt-get install librabbitmq-dev
如果你的Linux發行版沒有現成的librabbitmq-dev包,那麼可以通過下載源碼編譯安裝
然後如果你沒有安裝git話請安裝一下git,因為我們要從官方的版本庫中擷取原始碼
複製源碼並編譯
git clone git://github.com/alanxz/rabbitmq-c.gitcd rabbitmq-cgit submodule initgit submodule update
編譯庫
autoreconf -i && ./configure && make && sudo make install
然後我們需要去下載php擴充的原始碼,地址在此:
http://pecl.php.net/package/amqp
當前最新版本為1.4.0
wget http://pecl.php.net/get/amqp-1.4.0.tgztar zxf amqp-1.4.0.tgzcd amqp-1.4.0/phpize && ./configure --with-amqp && make && sudo make install
建立設定檔
sudoecho"extension = amqp.so" > /etc/php5/conf.d/amqp.ini
然後重啟你的web伺服器或者php-fpm並列印phpinfo,如果見到以下的內容就說明擴充安裝好了
例子
生產方
/** * PHP amqp(RabbitMQ) Demo - publisher * 生產者:發送訊息 * 邏輯:建立串連-->建立channel-->建立交換器對象-->發送訊息* *///配置資訊$conn_args = array( 'host' => 'localhost', 'port' => '5672', 'login' => 'guest', 'password' => 'guest', 'vhost'=>'/');$e_name = 'e_lamp'; //交換器名$k_route = 'key_1'; //路由key//建立串連和channel$conn = new AMQPConnection($conn_args);if (!$conn->connect()) { die("Cannot connect to the broker!\n");}$channel = new AMQPChannel($conn);//訊息內容$message = "TEST MESSAGE! 測試訊息!";//建立交換器對象$ex = new AMQPExchange($channel);$ex->setName($e_name);//發送訊息//$channel->startTransaction(); //開始事務for($i=0; $i<5; ++$i){ echo"Send Message:".$ex->publish($message, $k_route)."\n";}//$channel->commitTransaction(); //提交事務$conn->disconnect();
消費方
/** * PHP amqp(RabbitMQ) Demo - consumer * 消費者:接收訊息 * 邏輯:建立串連-->建立channel-->建立交換器-->建立隊列-->綁定交換器/隊列/路由鍵-->接收訊息* *///配置資訊$conn_args = array( 'host' => 'localhost', 'port' => '5672', 'login' => 'guest', 'password' => 'guest', 'vhost'=>'/');$e_name = 'e_lamp'; //交換器名$q_name = 'q_lamp'; //隊列名$k_route = 'key_1'; //路由key//建立串連和channel$conn = new AMQPConnection($conn_args);if (!$conn->connect()) { die("Cannot connect to the broker!\n");}$channel = new AMQPChannel($conn);//建立交換器$ex = new AMQPExchange($channel);$ex->setName($e_name);$ex->setType(AMQP_EX_TYPE_DIRECT); //direct類型$ex->setFlags(AMQP_DURABLE); //持久化echo"Exchange Status:".$ex->declare()."\n";//建立隊列$q = new AMQPQueue($channel);$q->setName($q_name);$q->setFlags(AMQP_DURABLE); //持久化echo"Message Total:".$q->declare()."\n";//綁定交換器與隊列,並指定路由鍵echo'Queue Bind: '.$q->bind($e_name, $k_route)."\n";//阻塞模式接收訊息echo"Message:\n";while(True){ $q->consume('processMessage'); //$q->consume('processMessage', AMQP_AUTOACK); //自動ACK應答}$conn->disconnect();/*** 消費回呼函數* 處理訊息*/functionprocessMessage($envelope, $queue) {$msg = $envelope->getBody(); echo$msg."\n"; //處理訊息$queue->ack($envelope->getDeliveryTag()); //手動發送ACK應答}
以上就介紹了Linux教程之ubuntu下手動編譯php-amqp擴充教程,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。