通常, web 工程在客户已经确定了要使用那种 rdbms (关系型数据库管理系统)之后被添加给已经存在的 it 基础结构。即使那并不是因为不同的预算可能影响的你选择何种数据用于部署的情况。最终,你作为开发者可能简单的偏好于不把自己绑在某个厂商身上。自此,意味着给每个支持的数据保持版本或者牺牲更多性能但是获得多于必须的易用性:走入 pear mdb 吧。
mdb 是着眼于使得编写 rdbms 无关的 php 程序成为简单的过程的数据库抽象层。大部分其他的 php 的所谓数据库抽象层紧紧给所有支持的数据库提供了一个公用 api 以及非常有限的抽象(大部分只是针对序列的)。mdb 另一方面能够用来抽象所有数据库发送和接收的数据。甚至数据库 schema 都能被定义为 rdbms 无关的格式。但是它提供这些功能的同时仍然保持了很高的性能以及简单易用。这是通过深入观察两个流行的数据库抽象层,pear db 和 metabase, 之后并且对它们进行了融合后获得的。而且在融合过程中,趁着这个机会清理了它们融合后的 api 以及任何影响性能的设计。
mdb 结合了 pear db 和 metabase 的大部分特性。实际上,pear db 的特性中唯一不再存在的是作为结果集返回一个对象。我们放弃了这个特性是因为这个特性不常用而且对于性能的损失是非常明显的。许多开发上的时间用在了使得 api 尽可能的好用。最终,mdb 非常高地提供了这些功能至少和 pear db 一样快而且比 metabase 快很多。这些最重要地特性的列表:
$session = '098f6bcd4621d373cade4e832627b4f6'; // set time out to 30 minutes $timeout = time()+60*30; // select query showing how the datatype conversion works $query = 'select createtime, user_id from sessions'; $query .= ' where session = '.$session; $query .= ' and lastaccess < '.$timeout;
// convert $timeout to the mdb timestamp format $timeout = mdb_date::unix2mdbstamp($timeout); // select query showing how the datatype conversion works $query = 'select createtime, user_id from sessions'; $query .= ' where session = '.$mdb->gettextvalue($session); $query .= ' and lastaccess < '.$mdb->gettimestampvalue($timeout);
$character_lob = array( 'type' => 'data', 'data' => 'this would be a very long string container the clob data' ); $clob = $mdb->createlob($character_lob);
如你从上个例子中能看到的那样,所有我们需要做的就是给表的每个域设定值。我们现在已经知道了必要的基础知识来创建一个 mdb 的 xml schema。下一步是把这个 schema 文件传递给 mdb 管理器。
$manager = new mdb_manager; $input_file = 'auth.schema'; // we do not have to connect to a specify a specific database at this time $dsn = "mysql://$user:$[email protected]$host"; $manager->connect($dsn); $manager->updatedatabase($input_file, $input_file. '.before');