PHPDAO
PropelやDoctrineに比べると機能は少なく、内部の構造が簡単に把握できるシンプルな構造になっています。
事前にスキーマにあわせたクラスを生成する必要があり、主にテーブルごとに次の3種類のクラスを生成します。データベース接続を管理するConnection factory、レコードのデータを保持するEntity、ORMを提供するDAOクラスを生成します。
特徴
自動生成されるクラスはあらかじめ用意されているテンプレートファイルから行われるので、独自のORMクラスを生成する場合はカスタマイズを行いやすい設計になっています。
PHPDAOが生成するクラスではPHPのマジックメソッドを利用しておらず、静的なコードで書かれているため実行速度が高速です。
実行例
以下にPHPDAOの実行例を記載します。PHPDAOの設定ファイルは自動生成されるため、引用を割愛します。
<?php // 設定ファイルを読み込み include_once 'generated/include_dao.php'; // Authorオブジェクトを生成 $author = new Author(); $rand = rand(1,100000); $author->name = 'name-'.$rand; $author->password = sha1('password-'.$rand); // Authorオブジェクトを保存 $id = DAOFactory::getAuthorDAO()->insert($author); // Authorオブジェクトを取得 $author = DAOFactory::getAuthorDAO()->load($id); // パスワードを変更し、更新 $author->password = sha1('newpassword-'.rand(1,100000)); DAOFactory::getAuthorDAO()->update($author); // Authorを削除 DAOFactory::getAuthorDAO()->delete($author->id);
データベースとのやりとりは、DAOFactoryから取得したDAOクラスを経由して行います。このDAOクラスに対して保存したいオブジェクトを引数として渡したり、取得したいデータのIDを渡します。
Active Recordモデルに比べてコーディング量は増えますが、メソッド補完を行うことができるのでコーディングスピードは遅くなりません。
定量評価
今回紹介したORMライブラリの実行速度を計測します。ORMライブラリを使わなかったときの速度と比較するために、PDOの値も計測します。
ベンチマークで計測するロジックはauthorテーブルに対して、主キーを利用してランダムに検索を行い、カラムの文字列を書き換えて更新します。これを5,000回行った結果を計測しています。テーブルにはあらかじめ10万件のレコードを挿入しておきます。ベンチマークの測定軸は実行速度とピーク時のメモリ使用量です。
測定環境は以下の通りです。
クライアント
- PHP:5.3.3
- OS:Debian GNU/Linux 5.0
- NIC:1Gbps
サーバ
- データベースサーバ:MySQL 5.0.67 icc version
- NIC:100Mbps
以下にピーク時のメモリ使用量のグラフを掲載します。
メモリ使用量はORMのAPIが抽象的であるほどメモリを多く消費しています。これだけシンプルなベンチマークであるのに、Doctrineは20MB近く消費しているのでDoctrineを利用する際はPHP自体の設定である、memory_limitを高めに設定する必要があります。
次に、実行速度の結果を掲載します。
実行速度も、ORMのAPIが抽象的であるほど実行時間が長いです。php-activerecordはほぼPDOと同じ速度なので、ORM自体のオーバーヘッドはとても少ないことがわかります。