ホームページ >バックエンド開発 >PHPチュートリアル >Linux チュートリアル: ubuntu での php-amqp 拡張機能チュートリアルの手動コンパイル

Linux チュートリアル: ubuntu での php-amqp 拡張機能チュートリアルの手動コンパイル

WBOY
WBOYオリジナル
2016-07-29 09:14:421209ブラウズ

Linux チュートリアル: ubuntu で php-amqp 拡張機能を手動でコンパイルするチュートリアル

まず、amqp とは何ですか?概要はこちら 簡単に言うと、高度なQueueプロトコルです。この拡張機能は、PHP が amqp プロトコルと関連する queueservice 通信をサポートできるようにするものです。

利点: サーバー処理の同時実行の問題を解決できます。
Advanced Messaging Queuing Protocol (AMQP) は、非同期メッセージングに使用されるアプリケーション層プロトコル仕様です。 AMQP クライアントは、API (JMS など) ではなくワイヤー層プロトコルとして、ソースに関係なくメッセージを任意に送受信できます。現在、さまざまなプラットフォーム向けに使用できるサーバーとクライアントがすでにかなりの数あります。

(1) 基本概念

RabbitMQ は、アーラン言語で開発された、人気のあるオープンソースのメッセージング queue システムです。 RabbitMQ は、AMQP (Advanced Message Queuing Protocol) の標準実装です。 AMQP に慣れていない場合、RabbitMQ ドキュメントを直接読むのは難しいでしょう。ただし、ここでは簡単に紹介する重要な概念がいくつかあるだけです。 いくつかの概念説明:

ブローカー: 簡単に言うと、メッセージ
    キュー
  • サーバーエンティティです。 Exchange: メッセージ交換。どのメッセージがどの
  • キュー
  • にルーティングされるかに従ってルールを指定します。 キュー: メッセージ
  • キュー
  • キャリア。各メッセージは 1 つ以上の キュー に入れられます。 バインディング: バインディング、その機能は、ルーティング ルールに従って交換とキューをバインドすることです。
  • ルーティング キー: ルーティング キーワード。Exchange はこのキーワードに基づいてメッセージを配信します。
  • vhost: 仮想ホスト。ブローカーで複数の仮想ホストを開いて、異なるユーザーの権限を分けることができます。
  • プロデューサー: メッセージプロデューサーは、メッセージを配信するプログラムです。
  • コンシューマ: メッセージ コンシューマは、メッセージを受け入れるプログラムです。
  • チャネル: クライアントの各接続で複数のチャネルを確立でき、各チャネルがセッション タスクを表します。
  • (2) 利用の流れ

つまり、クライアント - AMQPサーバー - クライアント

左側のクライアントは右側のクライアントにメッセージを送信します。プロセスは次のとおりです:


接続を取得
  • チャネルを取得
  • Exchange、Queueを定義
  • RoutingKeyを使用してキューをExchangeにバインドします
  • を指定します。 Exchange と RoutingKey メッセージは、対応するキューに送信されます。受信時には、受信側も接続を取得し、チャネルを取得してから、対象のキューからメッセージを直接フェッチするキューを指定します。 Exchange、RoutingKey、バインド方法については、対応するキューに移動してメッセージを取得すればOKです
  • ubuntuのデフォルトのソースにはphp5-amqpパッケージがないため、使用するには手動でコンパイルする必要があります。 amqp。
準備

:

phpコンパイルツールをインストールします

<code>sudo apt<span>-get</span> install php5<span>-dev</span></code>
rabbitmqライブラリをインストールします

<code>sudo apt<span>-get</span> install librabbitmq<span>-dev</span></code>

Linuxディストリビューションに既製のlibrabbitmq-devパッケージがない場合は、ソースコードをダウンロードしてコンパイルしてインストールできます

そして、git をインストールしない場合は、公式リポジトリからソース コードを取得する必要があるため、git をインストールしてください

ソース コードをクローンしてコンパイルします

<code>git <span>clone</span> git:<span>//<strong>github</strong>.com/alanxz/rabbitmq-c.git</span>
cd rabbitmq-c
git submodule init
git submodule update</code>

コンパイル ライブラリ

<code>autoreconf -i && ./configure && <span>make</span> && sudo <span>make</span> install</code>

それから、ダウンロードする必要がありますphp 拡張機能のソース コード、アドレスは次のとおりです:

http://pecl.php.net/package/amqp

最新バージョンは 1.4.0 です

<code>wget http://pecl<span>.php</span><span>.net</span>/get/amqp-<span>1.4</span><span>.0</span><span>.tgz</span>tar zxf amqp-<span>1.4</span><span>.0</span><span>.tgz</span>
cd amqp-<span>1.4</span><span>.0</span>/

phpize && ./configure --with-amqp && make && sudo make install</code>

設定ファイルを作成します

<code><span>sudo</span><span>echo</span><span>"extension = amqp.so"</span> > /etc/php5/conf.d/amqp.ini</code>

その後、 Web サーバーまたは php-fpm にアクセスし、phpinfo を出力すると、次のように表示されます。内容は、拡張機能がインストールされていることを示しています

Example

Producer

<code><span>/**
 * PHP amqp(RabbitMQ) Demo - publisher
 * 生产者:发送消息
 * 逻辑:创建连接-->创建channel-->创建交换机<strong>对象</strong>-->发送消息* 
 */</span><span>//配置信息</span><span>$conn_args</span> = <span>array</span>(
    <span>'host'</span> => <span>'localhost'</span>,
    <span>'port'</span> => <span>'5672'</span>,
    <span>'login'</span> => <span>'guest'</span>,
    <span>'password'</span> => <span>'guest'</span>,
    <span>'vhost'</span>=><span>'/'</span>
);
<span>$e_name</span> = <span>'e_lamp'</span>; <span>//交换机名</span><span>$k_route</span> = <span>'key_1'</span>; <span>//路由key</span><span>//创建连接和channel</span><span>$conn</span> = <span>new</span> AMQPConnection(<span>$conn_args</span>);
<span>if</span> (!<span>$conn</span>->connect()) {
    <span>die</span>(<span>"Cannot connect to the broker!\n"</span>);
}
<span>$channel</span> = <span>new</span> AMQPChannel(<span>$conn</span>);

<span>//消息内容</span><span>$message</span> = <span>"TEST MESSAGE! 测试消息!"</span>;

<span>//创建交换机<strong>对象</strong></span><span>$ex</span> = <span>new</span> AMQPExchange(<span>$channel</span>);
<span>$ex</span>->setName(<span>$e_name</span>);

<span>//发送消息</span><span>//$channel->startTransaction(); //开始事务</span><span>for</span>(<span>$i</span>=<span>0</span>; <span>$i</span><<span>5</span>; ++<span>$i</span>){
    <span>echo</span><span>"Send Message:"</span>.<span>$ex</span>->publish(<span>$message</span>, <span>$k_route</span>).<span>"\n"</span>;
}
<span>//$channel->commitTransaction(); //提交事务</span><span>$conn</span>->disconnect();</code>

Consumer

<code><span>/**
 * PHP amqp(RabbitMQ) Demo - consumer
 * 消费者:接收消息
 * 逻辑:创建连接-->创建channel-->创建交换机-->创建<strong>队列</strong>-->绑定交换机/<strong>队列</strong>/路由键-->接收消息*
 */</span><span>//配置信息</span><span>$conn_args</span> = <span>array</span>(
    <span>'host'</span> => <span>'localhost'</span>,
    <span>'port'</span> => <span>'5672'</span>,
    <span>'login'</span> => <span>'guest'</span>,
    <span>'password'</span> => <span>'guest'</span>,
    <span>'vhost'</span>=><span>'/'</span>
);
<span>$e_name</span> = <span>'e_lamp'</span>; <span>//交换机名</span><span>$q_name</span> = <span>'q_lamp'</span>; <span>//<strong>队列</strong>名</span><span>$k_route</span> = <span>'key_1'</span>; <span>//路由key</span><span>//创建连接和channel</span><span>$conn</span> = <span>new</span> AMQPConnection(<span>$conn_args</span>);
<span>if</span> (!<span>$conn</span>->connect()) {
    <span>die</span>(<span>"Cannot connect to the broker!\n"</span>);
}
<span>$channel</span> = <span>new</span> AMQPChannel(<span>$conn</span>);

<span>//创建交换机</span><span>$ex</span> = <span>new</span> AMQPExchange(<span>$channel</span>);
<span>$ex</span>->setName(<span>$e_name</span>);
<span>$ex</span>->setType(AMQP_EX_TYPE_DIRECT); <span>//direct类型</span><span>$ex</span>->setFlags(AMQP_DURABLE); <span>//持久化</span><span>echo</span><span>"Exchange Status:"</span>.<span>$ex</span>-><span>declare</span>().<span>"\n"</span>;

<span>//创建<strong>队列</strong></span><span>$q</span> = <span>new</span> AMQPQueue(<span>$channel</span>);
<span>$q</span>->setName(<span>$q_name</span>);
<span>$q</span>->setFlags(AMQP_DURABLE); <span>//持久化</span><span>echo</span><span>"Message Total:"</span>.<span>$q</span>-><span>declare</span>().<span>"\n"</span>;

<span>//绑定交换机与<strong>队列</strong>,并指定路由键</span><span>echo</span><span>'Queue Bind: '</span>.<span>$q</span>->bind(<span>$e_name</span>, <span>$k_route</span>).<span>"\n"</span>;

<span>//阻塞模式接收消息</span><span>echo</span><span>"Message:\n"</span>;
<span>while</span>(<span>True</span>){
    <span>$q</span>->consume(<span>'processMessage'</span>);
    <span>//$q->consume('processMessage', AMQP_AUTOACK); //自动ACK应答</span>
}
<span>$conn</span>->disconnect();

<span>/**
* 消费回调函数
* 处理消息
*/</span><span><span>function</span><span>processMessage</span><span>(<span>$envelope</span>, <span>$queue</span>)</span> {</span><span>$msg</span> = <span>$envelope</span>->getBody();
    <span>echo</span><span>$msg</span>.<span>"\n"</span>; <span>//处理消息</span><span>$queue</span>->ack(<span>$envelope</span>->getDeliveryTag()); <span>//手动发送ACK应答</span>
}</code>

上記は、関連コンテンツを含む、ubuntu 上の Linux チュートリアルでの php-amqp 拡張機能チュートリアルの手動コンパイルを紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。