PHP & Queue
                              PHP Study Meeting in Kanto, Japan #47




                                                                            させざき
                                                                              2009.11.7
                                                                  github.com/sasezaki


Photo by skoop / http://www.flickr.com/photos/skoop/2547899690/
・PHP5.3はNowdocの誘惑に負けて使ってます。
・YQLがあればいらないスクレイパークライアント作ってます。
・カメラのついてないPHS使ってます。
これからいくつか
質問していくので
挙手お願い致しま
す。 <(_ _)>
Q1.
SplQueueというクラスがPHP5.3では
絶対存在するということを知っている方
・・・
データ構造クラスのQueue・・・SplQueue
SplQueue クラスとは・・・
キューの主要な機能を提供します。
双方向リンクリストを使用して実装しています。(マニュアルより)
http://php.net/manual/ja/class.splqueue.php


$phpman SplQueue
あるいは

$php --rc SplQueue
                       ・反復処理の方向はFIFO。
                       ・SplPriorityQueueというのもある。
                       ・SplStackももちろんある。


                            『新訳 データ構造とネットワークアルゴリズム』
                  (R.E Tarjan (著), 岩野 和生 (翻訳)  毎日コミュニケーションズ))より
Q2.
定期バッチジョブを現在関わっている
システムにて動かしているという方
・・・
Q3.
PHPからバックグラウンド処理への”逐次
ジョブ”(C、Java、RDBMSのストアドなど)
を現在関わっているシステムにて動かし
ているという方
・・・
Q4.
PHPで定期バッチ処理コードを書いて動
かしたことのある方
・・・
Q5.
Gearmanを使ったこと・試したことのある方
(gearman拡張モジュール/perlの実装 両方)
Gearman・・・ジョブキューの注目株?
・Perlの実装版はYAPC Asia 2007でも取り上げら
れる。
・Digg、fuba_recorderなどでの運用実績
 (しかもNet_GearmanはDiggのコピーライト入り)

・2008年にBrian AkerによりCの実装版がリリース。
- 2009.9.29 Gearman server version 0.10
- 2009.9.29 Gearman php extension 0.6
・Rasmus LerdorfのブログやAndrei Zmievskiのスラ
イドにて言及あり
・・Slides about Gearman
http://www.slideshare.net/felixdv/high-gear-php-with-gearman
http://oddments.org/?p=55
http://www.slideshare.net/andreizm/all-the-little-pieces
・・・
Q6.
Q4Mを用いたシステムを現在稼働させて
いるという方
Q7.
Q4M以外のメッセージキューイングシステ
ムを稼働させたことのある方
・・・
Q8.
Zend Frameworkには、1.9から
Zend_Queueがあるのを知っている方
・・・。
Zend_Queue
・ZF1.9にて追加されたコンポーネント、
クライアント・ラッパー的なクラス
 (これ自体にジョブキューシステムが share/php/Zend/Queue
                      |-- Adapter
 備わってる訳ではない)          | |-- Abstract.php
                      | |-- Activemq.php
・ZFらしく各種アダプターが用意されている AdapterAbstract.php
                      | |--
                      | |-- AdapterInterface.php
 ・Array(主にデバッグ用)                  | |-- Apachemq.php
 ・Zend_Db                         | |-- Array.php
 ・Memcacheq                       | |-- Db
                                  | | |-- Message.php
 ・Apache ActiveMQ                 | | |-- Queue.php
   - Zend_Queue_Stompを使用          | | |-- mysql.sql
    (ActiveMQについては第28回PHP勉強会      | | |-- postgresql.sql
                                  | | `-- queue_sqlite.php
    でのakkyさんの発表あり)                | |-- Db.php
 ・Zend Platform JobQueue          | |-- Memcacheq.php
                                  | |-- Null.php
                                  | `-- PlatformJobQueue.php
 ※ Amazon SQS用のアダプタも作られていましたが、 Exception.php
                                  |--
 Zend_Service_Amazon_Sqsに移動されました。 |-- Message
                                          | |-- Iterator.php
                                          | `-- PlatformJob.php
                                          |-- Message.php
                                          `-- Stomp
Zend_Queueの例
require_once 'Zend/Queue.php';

// アダプタ用のオプション設定
$options = array('name' => 'queue1');

// 配列待ち行列の作成
$queue = new Zend_Queue('Array', $options);

// 待ち行列にメッセージを送信
$queue->send('Hello 1');
$queue->send('Hello 2');
$queue->send('Hello 3');

// 待ち行列からメッセージを2件取り出す
$messages = $queue->receive(2);

// メッセージ群はIteratorに格納されている。
foreach ($messages as $message) {
   echo $message->body, ",";
} // Hello 1, Hello2, と表示される。

詳しい使い方はテストコードを参照
Zend_Queueを使ってみる

デモ概要           
 
   
  ・Queueと言えばクローラですが(?)
             http://labs.cybozu.co.jp/blog/kazuho/archives/2008/04/q4m_crawler.php
  http://coderepos.org/share/browser/docs/mala/20081127-shibuyapm10-lt/main.txt


 ・Zendの人が作ったSpiderライブラリを改造
  (Httpリクエストのキューを扱う)
 ・perlのWeb::Collectorっぽいものを作る。
                                           http://en.yummy.stripper.jp/?eid=976179


 ・今回は架空の画像掲示板からのぶっっこ抜き例
demo
・・・
“一方ロシアは、
前髪ぱっつん専用tumblr(実在)から
api経由で画像を取得した。”
ご清聴・ご協力ありがとうございました。
結果 30人中
Q1 1人
Q2 18人
Q3 1人
Q4 25人
Q5 1人
Q6 1人
Q7 3人
Q8 1人

PHP & Queue