详细说明:
- Dao定义:数据处理层,主要负责操作数据和数据缓存。
- InitPHP框架的DAO层提供了丰富的数据库操作接口和缓存接口。详细可参考API文档。
- 所有的Dao需要继承InitPHP框架提供的框架基类Dao
- 建议使用Zend Studio工具开发,有代码提示功能,能将所有的API提示显示,方便您的开发速度
API使用:
- Dao类中使用InitPHP框架的API主要分为两个部分,一个是缓存,一个是DB操作
- 缓存操作$this->dao->cache->:缓存现在提供三种缓存,MYSQL缓存,文件缓存,MEMCACHE缓存,有统一的缓存接口。缓存的API接口暂时提供四个最常用的。
- DB操作$this->dao->db->:DB接口提供了丰富的数据库操作接口,包括:sql_build接口,DB操作接口,分表分库函数接口和常用DB函数接口(例如:get_one())
class testDao extends Dao {
public function test() {
$this->dao->cache->set('test', '缓存的值', 0, 'FILE'); //缓存接口使用方法
$this->dao->db->insert(array('name' => 'cccccccc'), 'test'); //DB接口使用方法
print_r($this->dao->db->get_all('test'));
}
}
应用配置:
- 将
initphp/initphp.conf.php 中的DAO配置拷贝到应用配置文件中
conf/conf.php
- 配置信息暂时分为三部分:DAO配置、缓存配置和数据库配置
- DAO配置:主要配置Dao类存放的目录和Dao类名的后缀名称。
- 缓存配置:如果你使用memcache缓存则需要配置memcache服务器,文件缓存需要配置文件缓存目录
- 数据库配置:主要配置数据库信息
/**
* Dao配置参数
* 1. 你可以配置Dao的路径和文件(类名称)的后缀名
* 2. 一般情况下您不需要改动此配置
*/
$InitPHP_conf['dao']['dao_postfix'] = 'Dao'; //后缀
$InitPHP_conf['dao']['path'] = 'library/dao/'; //后缀
/**
* 缓存配置参数
* 1. 您如果使用缓存 需要配置memcache的服务器和文件缓存的缓存路径
* 2. memcache可以配置分布式服务器,根据$InitPHP_conf['memcache'][0]的KEY值去进行添加
* 3. 根据您的实际情况配置
*/
$InitPHP_conf['memcache'][0] = array('127.0.0.1', '11211');
$InitPHP_conf['cache']['filepath'] = 'data/filecache'; //文件缓存目录
/**
* 数据库配置
* 1. 根据项目的数据库情况配置
* 2. 支持单数据库服务器,读写分离,随机分布的方式
* 3. 可以根据$InitPHP_conf['db'][0]['driver'] 选择mysql mysqli(暂时支持这两种)
* 4. 支持多库配置 $InitPHP_conf['db_multi']['test']
* 5. 详细见文档
*/
$InitPHP_conf['db']['driver'] = 'mysqli'; //mysql,mysqli 默认必填
$InitPHP_conf['db']['default']['db_type'] = 2; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['default'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default'][0]['password'] = '1234562'; //数据库密码
$InitPHP_conf['db']['default'][0]['database'] = 'test'; //数据库
$InitPHP_conf['db']['default'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default'][0]['pconnect'] = 0; //是否持久链接
$InitPHP_conf['db']['default2']['db_type'] = 1; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['default2'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][0]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][0]['database'] = 'test'; //数据库
$InitPHP_conf['db']['default2'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default2'][0]['pconnect'] = 0; //是否持久链接
$InitPHP_conf['db']['default2'][1]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][1]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][1]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][1]['database'] = 't1'; //数据库
$InitPHP_conf['db']['default2'][1]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default2'][1]['pconnect'] = 0; //是否持久链接
$InitPHP_conf['db']['test2']['db_type'] = 0; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['test2'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['test2'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['test2'][0]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['test2'][0]['database'] = 't1'; //数据库
$InitPHP_conf['db']['test2'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['test2'][0]['pconnect'] = 0; //是否持久链接
调用Dao类:
- InitPHP框架提供了一个InitPHP::getDao() 全局API函数,可以直接单例-实例化Dao
- 接口有两个参数,第一个参数是Dao的类名称,不需要带后缀'Dao';第二个参数是文件夹路径,默认Dao都是放在
lib/dao/文件夹下的,也会碰到项目比较庞大,将Dao类进行分类,比如分成User的类,那么文件夹目录
lib/dao/user/
- InitPHP::getService和InitPHP::getDao两个接口的用法类似。全局都可以使用。如果用户采用MVC模式,直接在Controller中直接导入Dao即可。
/**
* 【静态】获取Dao-实例并且单例模式获取Dao
* 1.单例模式获取
* 2.可以选定Dao路径path
* 3. dao需要在配置文件中配置参数,$path对应dao目录中的子目录
* 全局使用方法:InitPHP::getDao($daoname, $path = '')
* @param string $daoname 服务名称
* @param string $path 路径
* @return object
*/
public static function getDao($daoname, $path = '') {
global $InitPHP_conf;
$path = ($path == '') ? '' : $path . '/';
$class = $daoname . $InitPHP_conf['dao']['dao_postfix'];
$file = rtrim($InitPHP_conf['dao']['path'], '/') . '/' . $path . $class . '.php';
if (!InitPHP::import($file)) return false;
$obj = InitPHP::loadclass($class);
return $obj;
}
新增DB驱动:
- InitPHP暂时只支持mysql和mysqli。如果用户需要支持sqlservice之类的,可以自己扩展。
- DB驱动目录:
initphp/core/dao/db/driver/文件夹下
- 扩展的话,文件名称为:驱动名称 + '.init.php',类名称:驱动名称+'Init'。必须要继承dbbaseInit基类,然后实现里面的抽象方法。
- 驱动的使用: $InitPHP_conf['db']['driver'] = 'mysqli'; //默认mysql 可以不填该参数
分表分库:
- 数据库数据量比较庞大的时候,就需要做分表分库的处理。分表和分库操作是有一定的讲究的,InitPHP中提供了三个常用的分表分库公用函数。
/**
* 按月分表-分库方法
* 1. 当数据表数据量过大的时候,可以根据按月分表的方法来进行分表
* 2. 按月分库会根据当前的时间来决定是几月份的数据
* 3. 按月分库$defaultId,可以自定义填入月份,例如:get_mon_table('test', 2),则返回 test_02
* Dao中使用方法:$this->dao->db->month_identify($tbl, $defaultId = '')
* @param string $tbl
* @param string $defaultId
*/
public function month_identify($tbl, $defaultId = '') {
if (empty ( $defaultId )) {
$mon = sprintf ( '%02d', date ( 'm', InitPHP::getTime() ));
return $tbl . '_' . $mon;
} else {
return $tbl . '_' . sprintf ( '%02d', $defaultId );
}
}
/**
* 根据数值来确定分表-分库方法
* 1. 可以自定义分表-分库的模板前缀$tbl变量
* 2. 可以自定义截取长度
* 3. 一般可以根据用户UID来获取分表或者分库
* Dao中使用方法:$this->dao->db->num_identify($num, $tbl, $default = 1)
* @param int $num 数值
* @param string $tbl 模板前缀
* @param int $default 默认截取长度
*/
public function num_identify($num, $tbl, $default = 1) {
$num = (string) $num;
$len = strlen($num);
if ($len >= $default)
$str = substr($num, $len - $default, $default);
else
$str = str_pad($num, $default, '0', STR_PAD_LEFT);
return $tbl . '_' . $str;
}
/**
* 求余数的方式获取分表-分库方法
* 1. 求余方式余数比较少,适合小型的分表法
* 2. 可以自定义求余除数
* Dao中使用方法:$this->dao->db->fmod_identify($num, $tbl, $default = 7)
* @param int $num
* @param string $tbl
* @param int $default
* @return
*/
public function fmod_identify($num, $tbl, $default = 7) {
return $tbl . '_' . fmod($num/$default);
}
分布式数据库处理:
- InitPHP的数据库操作,通过改变配置文件,轻松实现主从、随机分布和单数据库服务器之间的切换。
- 配置参数:$InitPHP_conf['db']['default']['db_type'] = 0; //0-单个服务器,1-读写分离,2-随机
- 主从:$InitPHP_conf['db']['default'][$key],主服务器的是写数据库的服务器,$key值默认为0,从服务器(读取操作,一般读取操作压力比较大)的为$key值大于0的随机一台
- 随机分布:$InitPHP_conf['db']['default'][$key],会随机选择一个$key值
/* 单数据库配置文件配置方案,默认为default: */
$InitPHP_conf['db']['driver'] = 'mysqli'; //mysql,mysqli 默认必填
$InitPHP_conf['db']['default']['db_type'] = 2; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['default'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default'][0]['password'] = '1234562'; //数据库密码
$InitPHP_conf['db']['default'][0]['database'] = 'test'; //数据库
$InitPHP_conf['db']['default'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default'][0]['pconnect'] = 0; //是否持久链接
/**********************************************************************/
/* 主从数据库配置文件方案 */
$InitPHP_conf['db']['default2']['db_type'] = 1; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['default2'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][0]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][0]['database'] = 'test'; //数据库
$InitPHP_conf['db']['default2'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default2'][0]['pconnect'] = 0; //是否持久链接
$InitPHP_conf['db']['default2'][1]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][1]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][1]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][1]['database'] = 't1'; //数据库
$InitPHP_conf['db']['default2'][1]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default2'][1]['pconnect'] = 0; //是否持久链接
/**********************************************************************/
/* 随机分布数据库配置文件方案 mysql-cluster适用 */
$InitPHP_conf['db']['default2']['db_type'] = 2; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['default2'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][0]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][0]['database'] = 'test'; //数据库
$InitPHP_conf['db']['default2'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default2'][0]['pconnect'] = 0; //是否持久链接
$InitPHP_conf['db']['default2'][1]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default2'][1]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default2'][1]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['default2'][1]['database'] = 't1'; //数据库
$InitPHP_conf['db']['default2'][1]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default2'][1]['pconnect'] = 0; //是否持久链接
多数据链接:
- 应用复杂的时候,可能应用中需要链接多个不同的数据库,这个情况下就需要支持多库链接。
- InitPHP提供了一个简单的解决方案。详细看下面的代码部分:
/* 多库链接数据库配置方案 */
$InitPHP_conf['db']['driver'] = 'mysqli'; //mysql,mysqli 默认必填
$InitPHP_conf['db']['default']['db_type'] = 2; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['default'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['default'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['default'][0]['password'] = '1234562'; //数据库密码
$InitPHP_conf['db']['default'][0]['database'] = 'test'; //数据库
$InitPHP_conf['db']['default'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['default'][0]['pconnect'] = 0; //是否持久链接
$InitPHP_conf['db']['test2']['db_type'] = 0; //0-单个服务器,1-读写分离,2-随机
$InitPHP_conf['db']['test2'][0]['host'] = '127.0.0.1'; //主机
$InitPHP_conf['db']['test2'][0]['username'] = 'root'; //数据库用户名
$InitPHP_conf['db']['test2'][0]['password'] = '123456'; //数据库密码
$InitPHP_conf['db']['test2'][0]['database'] = 't1'; //数据库
$InitPHP_conf['db']['test2'][0]['charset'] = 'utf8'; //数据库编码
$InitPHP_conf['db']['test2'][0]['pconnect'] = 0; //是否持久链接
/****************************************************************************/
/* DAO使用方法 */
class testaDao extends Dao {
//多库链接,对应test2的数据库-$InitPHP_conf['db']['test2']
public function test() {
$this->init_db('test2')->insert_more(array('username'), array(array('init'),array('woshishen')), 'test');
}
}