手軽なPHPオブジェクト永続化のためのクラスStoredObjectを0.2にしました。

1オブジェクト=1ファイルだと10,000件の検索に5秒ぐらいかかるので1クラス=1ファイルにしました。(1オブジェクト=1行)

DataObjectよりシンプルにするためにfactoryを廃止。

下記は永続化のサンプル。

StoredObject#store()で保存。(保存先はデフォルトだと実行したディレクトリ。コンストラクタの第二パラメータでディレクトリ指定できます)

require_once("StoredObject.php");

class Book {
    var $name;
    var $price;
    var $releaseDate;
}

$storedObject =& new StoredObject("Book");

$book =& new Book();
$book->name = "軽快なJava";
$book->price = "1000";
$book->releaseDate = "2004/12/01";
$storedObject->store($book);

$book->name = "Effective C++";
$book->price = "2000";
$book->releaseDate = "2004/12/02";
$storedObject->store($book);

$book->name = "Programming Perl";
$book->price = "3000";
$book->releaseDate = "2004/12/03";
$storedObject->store($book);

StoreObject#get()で取ってきます。

require_once("StoredObject.php");

class Book {
    var $name;
    var $price;
    var $releaseDate;
}

$storedObject =& new StoredObject("Book");

$book1 =& $storedObject->get("name", "軽快なJava");
var_dump($book1);

$book2 =& $storedObject->get("name", "Effective C++");
var_dump($book2);

$book3 =& $storedObject->get("name", "Programming Perl");
var_dump($book3);

実行結果はこんな感じです。_StoredObject_hashというのはStoreObjectが勝手に割り当てているハッシュ値です。

object(book)(4) {
  ["name"]=>
  string(10) "軽快なJava" 
  ["price"]=>
  string(4) "1000" 
  ["releaseDate"]=>
  string(10) "2004/12/01" 
  ["_StoredObject_hash"]=>
  string(32) "8141cda9579ef74e052390de23770469" 
}
object(book)(4) {
  ["name"]=>
  string(13) "Effective C++" 
  ["price"]=>
  string(4) "2000" 
  ["releaseDate"]=>
  string(10) "2004/12/02" 
  ["_StoredObject_hash"]=>
  string(32) "2d37647c506ed9a84f3e2966afcf40e0" 
}
object(book)(4) {
  ["name"]=>
  string(16) "Programming Perl" 
  ["price"]=>
  string(4) "3000" 
  ["releaseDate"]=>
  string(10) "2004/12/03" 
  ["_StoredObject_hash"]=>
  string(32) "ec905200936acd1ae7ecdcc6e7a4099d" 
}

find()メソッドや正規表現での検索を追加予定です。

StoreObject-0.2.tgz

はてなダイアリー – Amethyst製作日記

一つ考えられる方法として、オブジェクト管理クラスを用意して、そのオブジェクト管理クラスは管理対象のオブジェクトをシリアライズしてローカルにファイルとして保存、読み出しを行えるようにするとか。

まぁ、ファイル読み書きのオーバーヘッドが発生しちゃうけど、現実的な実装方法なのかも知れない。

コレを見てPHPで手軽にオブジェクトの永続化ができたらいいなと思ったのでちょっと作ってみました。

早い話が設定やDBがいらないDB_DataObjectといったものです。

require_once("StoredObject.php");

class Book {
    var $name;
    var $price;
    var $releaseDate;
}

$book =& new Book();
$book->name = "Effective Java";
$book->price = "1000";
$book->releaseDate = "2004/12/01";

$storedBook =& StoredObject::factory("Book");
$storedBook->store($book);

クラス名でStoredObjectのfactoryを動かして、store()でオブジェクトを保存します。

require_once("StoredObject.php");

$book =& StoredObject::factory("Book");
$book->get("name", "Effective Java");
var_dump($book);

DataObjectライクに永続化していたオブジェクトを取得。

仕組みは簡単でクラス名で作成したディレクトリに1オブジェクトに対応する1ファイルを作ってserialize()保存しているだけです。取得するところはオブジェクトが増えると半端じゃなく遅くなると思いますが、何のインストールも設定ファイルもいらないのでプロトタイプの作成にはいいかもしれないです。

StoredObject-0.1.tgz

BMediaNode: PHPでのオブジェクトプーリング

かなり大げさになりますが、memcachedというデーモンを使うとPHPでもオブジェクトのプーリング・キャッシングは可能になるみたいです。PHP用のクライアントAPIはPECLに含まれています。

PHPでオブジェクトプーリングを実現するもの。なるほど、PHPだとリクエストごとに消えちゃうし、別リクエストでは別ものになっちゃうので常駐してるデーモンに確保しといてもらうって感じですか。

・・・Servletでいいじゃん。

2ちゃんねるベストヒット: 自分の知らなかった妻の顔

[既婚男性(仮)] 怪しいぞ!嫁の不審な行動を監視するスレ ttp://human5.2ch.net/test/read.cgi/tomorrow/1096325759/l50

212 名前:素敵な旦那様 投稿日:04/11/24 09:58:44 仕事が早く終わって帰宅したらいなかった。 寝室で着替えてるうちに戻ったらしく、台所で音がしてたので おどかそうかとこっそり行ってみたら、 マツケンサンバ歌いながら激しくステップ踏んでた(上手)。 梅酒あおりながら。 その後、スーパーの袋から焼き鳥出して立ったまま食べ、 「う、う、うーまーいー!」と叫んで、またマツケンサンバ。 「キュッキュッ!」とか「えいえい!」とか意味不明な合いの手を入れながら。 出ていけなくてしばらくそのまま見てた。

「帰ってるよ」と出てった時の泣き笑いみたいな顔、初めて見る顔だった。

笑った。

H A R U P A N O B L O G: RSS Factory に Impress Watch 系ニュースを追加

フィルタを書くだけの力仕事ですが、正規表現の勉強にはなります・・・。

ImpressのHeadlineのRSSがありがたい。これでやっと巡回ページが全部RSSリーダで読めるようになりました。

持ってる書籍の一覧をISBNのリストから作ろうと思ってPEARのServices_Amazonを使ってみたら・・・

Invalid locale parameter "jp". Valid locales are: de uk us

jp駄目なのかよ。

先日、PHPのセッション絡みの障害があり、調べてみました。何かというと「セッションIDが重複することがあるのか」ということについて。

PHP4.3.9のソースで見てみるとextというディレクトリがあります。これは拡張機能関連のソースがある場所のようで、pgsqlやmingやxmlなどが入ってます。ここにsessionディレクトリもありました。。拡張といっても本当のコア機能以外は全部ここに入っているようです。

php-4.3.9/ext/session の中のsession.cを見てみるとphp_session_create_idという露骨な名前の関数が定義されています。中身は大雑把に見ると、時間と php_combined_lcg()をMD5でハッシュ化しているようです。php_combined_lcgをググってみると、

[PHP-users 11996] Re: 「他人の情報を表示するサイト」

php_combined_lcgはマルチプロセスサーバー(プロセスをフォームするサーバー) ではPIDをマルチスレッドサーバーではthread_idを利用して疑似乱数を生成してい ます。したがって、仮に、micro秒単位で同じ時刻にアクセスしても同じセッション IDは生成されません。

msessionはセッション情報を全てメモリに保持しているのでセッションID のコリージョンを検出しています

どうやらPHPのセッションIDは理論的に絶対に重複しないようです。でもこれって、Webサーバが複数ある状態で1つのDBにセッションを保存している場合、同じ時刻で偶然プロセスIDも一緒だったら重複しちゃうんじゃないでしょうか。もう少し調べてみたいです。

2005/05/17 追記: 一部間違いがありました。 ref: PHPのセッションID2

guesswork

button_guesswork.png

guessworkは、「ややこしいフレームワークは使いたくない」けど「なんでもありになりがちなPHPスクリプトをスッキリさせる指針が欲しい」と考えている人のための軽量なフレームワークです。

個人的に超注目のPHPフレームワークguesswork

何が超注目なのかっていうと、「サイトがかわいい」

まだVersion 0.0.1なのになんでこんなにかわいいんですか?

2ちゃんねるベストヒット: ハウルの動く城を見てきたかのように語る

[ネトゲ実況] ハウルの動く城をさも見てきたかのように語るスレinネ実 ttp://game7.2ch.net/test/read.cgi/ogame/1100597954/l50

76 名前:既にその名前は使われています 投稿日:04/11/16 19:15:45 ID:xRtz7F 7 思った以上に、動いてた。

笑った。

デザインパターンMLでDTOの定義について話題がありました。

自分は勘違いしていたなと思いました。 基本的にはリモートにある粒度の小さいオブジェクトをいちいち持ってくるとコストがかかるのでDTOで一気に持ってこようって感じなんですな。

Martin Fowler’s Bliki in Japanese – ローカルDTO

DTOのようなものを使うとよいのは、 プレゼンテーション層のモデルとドメインモデルとの間に 大きなミスマッチがある場合です。 この場合、プレゼンテーションに特化したファサード(またはゲートウェイ)を作り、 ドメインモデルをマッピングして、プレゼンテーションに都合のよいインターフェースを 提供するのは理に適っています。

ローカルで使うのは上記のような場合だそうです。

MLに出ていた 「とりあえず、ドメインモデルのような凝ったことは考えずにベタッと処理を書いておき、「不吉な匂い」がして来たら設計をリファクタする」 というのに賛成です。