Zend_Queueの基本的な機能
次にZend_Queueコンポーネントの仕組みや、基本的な機能についてざっと見ていきましょう。他のコンポーネントでも見られたデザインですが、Zend_Queueコンポーネントは処理の受付をするZend_Queueクラス本体と実際の機能を提供するアダプタに分かれて提供されています。メッセージを格納する方法ごとにアダプタがあり、そのアダプタの挙動の差をZend_Queueクラスで吸収するわけです。
Zend_Queueのアダプタ
メッセージを格納する方法は、システムの規模や用途等の条件によって最適なものが変わってきます。Zend_Queueコンポーネントには、標準で5種類のメッセージを格納する準備がされており、それぞれがアダプタとして提供されています。なお、先程の例で見た配列を利用したもの(Zend_Queue_Adapter_Array)も、そのアダプタの一つです。
名前 | 説明 |
Activemq | Apache ActiveMQを利用 |
Db | Zend_Dbを利用してデータベース上に格納 |
Memcache | Memcache上で動くMemcacheQを利用 |
PlatformJobQueue | Zend PlatformのJob Queueを利用 |
Array | メッセージはPHPの配列に格納。プロセス間の通信ができない等、主にテスト用のアダプタ |
これらのうち、Activemq アダプタから PlatformJobQueueアダプタまでは、外部のプロセスにメッセージを格納します。Activemq アダプタが利用する Apache ActiveMQ と Memcache アダプタが利用する MemcacheQ はメッセージキュー等を管理するために設計されたプログラムです。一方で Db アダプタはZend_Dbコンポーネントを経由して通常のデータベースにメッセージを格納します。
PlatformJobQueueアダプタは少し特殊で、Zend Frameworkを提供しているZend Technologies社のZend Platform上で利用することを想定しています。Zend Platform は統合的なアプリケーションサーバで、その機能の一部として、ジョブを待ち行列で管理する Job Queue を提供しています。この Job Queue は単純なメッセージキューではなく、PHPのプログラムとそのプログラムへのパラメータを管理するキューになっています。
ArrayアダプタはPHPのローカルな配列にメッセージを格納します。配列は各プロセスごとに独立なので、プロセス間での通信には利用することができません。主にユニットテストなどを書くために使用することが想定されています。
このように特色のあるアダプタが標準で準備されていますが、基本的な使い方は同じようになっています。
Zend_Queueのコンストラクタ
Zend_Queueクラスのコンストラクタは通常、次の形式で呼び出します:
$queue = new Zend_Queue(アダプタ, オプション);
このうち、「アダプタ」は文字列でアダプタ名を与えるか、利用したいアダプタのインスタンスを与えます。
「オプション」は、アダプタを設定するための情報等を、配列かZend_Configクラスのオブジェクトで渡します。オプションに関しては、利用するアダプタごとに必要な内容が変わります(詳細は各アダプタの説明を参照してください)。
Zend_Queueのメソッド
Zend_Queueクラスのメソッドのうち、アダプタ経由でメッセージキューを操作するためのものを紹介します。なお、一部のアダプタでは、これらのメソッドの一部が利用できないことがあります。
名前 | 説明 |
createQueue | メッセージキューを作成します |
deleteQueue | メッセージキューを削除します |
send | メッセージをキューに追加します |
receive | メッセージをキューから取得します |
deleteMessage | キューにあるメッセージを削除します |
count | キュー内にあるメッセージの数を返します |
isExists | キューが存在するかを返します |
createQueueメソッドとdeleteQueueメソッドはメッセージキューの作成や削除に関するメソッドです。メッセージキューは通常、管理したいデータの種類に応じて複数持つことができます。createQueueメソッドを使えば 2つ目以降のメッセージキューに関してはZend_Queueクラスのコンストラクタを利用しなくても簡単に作成することができます。
$queue2 = $queue->createQueue("codezine_queue2", 5); ... $queue->deleteQueue($queue);
リスト5で作成した2つ目の「$queue2」は、最初に作成した「$queue」と同じように利用することができます。また、ここではキューのディフォルトのタイムアウト時間を5秒に設定しています(タイムアウト時間は省略可能で、その場合にはアダプタごとのディフォルト値が利用されます)。
send メソッド、receive メソッドとdeleteMessageメソッドはリスト1~3で見たように、メッセージキューと通信するためのメソッドです。send メソッドはメッセージの追加、receive メソッドはメッセージの受け取り、deleteMessage メソッドはメッセージの削除を行います。
countメソッドはキュー内にあるメッセージの数を返すメソッドです。
$count = $queue->count();
isExistsメソッドは、あるメッセージキューが既に存在するかどうかを調べるためのメソッドです。
if (!$queue->isExists('codezine_queue')) { echo "codezie_queueは既に存在するよ!\n"; }
次にそれぞれのアダプタについて見ていきましょう。まずはDBアダプタです。