微服务之数据库服务-客户端(PHP+YII)
来源:互联网 发布:徐老师淘宝外设店 编辑:程序博客网 时间:2024/06/07 03:39
以YII、自定义数据操作两种方式组成的数据库微服务的客户端。
类介绍
Base类
Dg_Db_Base,继承自Dg_Db_Yii类
class Dg_Db_Base extends Dg_Db_Yii {}
Yii类
Dg_Db_Yii,继承自Dg_Db_Hnb类,以YII框架的方式调用数据库。
实现思路:
1,通过魔术函数(__call、__callStatic、__set),获取函数调用链中的信息并存储。
2,将获取的调用链中的信息请求至服务端。
3,服务端通过函数(call_user_func_array、forward_static_call_array),调用YII提供的相关函数。
/** * 数据库操作基类,基于Yii框架。继承后即可使用Yii框架中的操作数据库的方式。 * 操作数据库可以分为如下三类(可以参考Yii2中的使用说明) * 一、Command操作,以commandDone函数结尾。 * Model::getInstance()->createCommand({查询语句})->queryAll()->commandDone(); * Model::getInstance()->createCommand({修改语句})->execute()->commandDone(); * Model::getInstance()->createCommand()->insert('{表名}', ['{字段}'=>'{值}'], '{条件}')->execute()->commandDone(); * Model::getInstance()->createCommand()->update('{表名}', ['{字段}'=>'{值}'], '{条件}')->execute()->commandDone(); * Model::getInstance()->createCommand()->delete('{表名}','{条件}')->execute()->commandDone(); * 二、ActiveRecord操作,以recordDone函数结尾。 * 查询 * Model::find()->select('f_id,name')->where([f_id'=>'5'])->limit(10)->all()->recordDone(); * Model::findOne(3)->recordDone(); * Model::findAll([1,3,5])->recordDone(); * Model::findAll(['f_id'=>3])->recordDone(); * 插入 * $obj = Model::getInstance(); * $obj->name = '西米'; * $obj->save()->recordDone(); * 更新 * $obj = Model::findOne(7); * $obj->name = '西米123'; * $obj->save()->recordDone(); * 删除 * $obj = Model::findOne(7); * $obj->delete()->recordDone(); * 递增 * Model::updateAllCounters(['f_create_time' => 10])->recordDone(); * 三、Query操作,以queryDone函数结尾 * Model::getInstance()->select('f_id,f_name,f_email')->from('t_transact_user_info')->where(['f_id'=>'1513'])->limit(10)->all()->queryDone(); */class Dg_Db_Yii extends Dg_Db_Hnb { private $_callArr = array(); public function __call($fun, $arguments) { $this->_callArr[$fun] = !empty($arguments) ? $arguments : ''; return $this; } private static $_callStaticArr = array(); public function __callStatic($fun, $arguments) { $class = get_called_class(); $self = new $class(); self::$_callStaticArr[$fun] = !empty($arguments) ? $arguments : ''; return $self; } private $_callSetArr = array(); public function __set($name, $value) { $this->_callSetArr[$name] = $value; } /** * 执行 */ private function done($type = 'index') { $this->init(); // 请求 $requestParam = array( '_call' => $this->_callArr, '_callStatic' => self::$_callStaticArr, '_callSet' => $this->_callSetArr, ); $url = $this->getRequestUrl('query', $type); $result = $this->getRequestText($url, $requestParam); $result = json_decode($result, true); if ( !$result['state'] && !empty($result['data']) ) { unset($this->_callArr); self::$_callStaticArr = array(); // 数据解密处理 if ( count($result['data']) == count($result['data'],1) ) { $result['data'] = current($this->_decryptyData(array($result['data']))); } else { $result['data'] = $this->_decryptyData($result['data']); } } return $this->formatResult($result); } /** * 返回数据格式化 */ public function format($default = '') { $this->_formatResult = true; $this->_formatDefault= $default; return $this; } /** * Yii\db\Query命令请求 */ public function queryDone() { return $this->done('index'); } /** * Yii\db\ActiveRecord命令请求 */ public function recordDone() { return $this->done('record'); } /** * Yii\db\Command命令请求 */ public function commandDone() { return $this->done('command'); }}
Hnb类
Dg_Db_Hnb,自定义的数据库调用方式。
实现思路:
1,自定义操作数据库相关的函数,如query、queryWithTotal、detail、countNum、insert、update等函数。
2,将相关参数请求至服务端并调用对应的函数(服务端需要定义相关的函数操作数据库)。
/** * 数据库操作基类,继承后即可使用数据库操作相关的函数 * 查询函数,query、queryWithTotal、one、detail、countNum * 操作函数,insert、insertMulit、replace、replaceMulti、update、delete、incr * 事务函数,startTransct、commitTransact、rollbackTransact * 配置函数,setDbType、setDbName、setTable、setField */class Dg_Db_Hnb extends Dg_Singleton { /** * 查询数据 * @param array $param 查询条件,条件数组或者条件SQL * @param string $order 排序规则 * @param string $limit 获取条数 * @param string $field 查询的列,默认为* * @param string $group 分组规则 * @return array 数据列表 */ public function query($param = array(), $order = false, $limit = false, $field = '*', $group = false) { $param = $this->_encryptyParam($param); $requestParam = array( 'param' => serialize($param), 'order' => strval($order), 'limit' => strval($limit), 'field' => strval($field), 'group' => strval($group), ); $url = $this->getRequestUrl('dql', __FUNCTION__); $result = $this->getRequestText($url, $requestParam); $result = json_decode($result, true); if ( !$result['state'] && !empty($result['data']) ) { $result['data'] = $this->_decryptyData($result['data']); } return $this->formatResult($result, array()); } /** * 查询一条数据 * @param array $param 查询条件,条件数组或者条件SQL * @param string $field 查询的列,默认为* * @return array 数据 */ public function detail($param, $field = '*') { $param = $this->_encryptyParam($param); $requestParam = array( 'param' => serialize($param), 'field' => strval($field), ); $url = $this->getRequestUrl('dql', __FUNCTION__); $result = $this->getRequestText($url, $requestParam); $result = json_decode($result, true); if ( !$result['state'] && !empty($result['data']) ) { $result['data'] = current($this->_decryptyData(array($result['data']))); } return $this->formatResult($result, array()); } /** * 删除数据 * @param array $param 查询参数,同query * @return array( * 'state' => 0(0成功,其他错误码), * 'errorCode' => '', * 'data' => ''(错误信息或者受影响的行数) * ) */ public function delete($param) { $param= $this->_encryptyParam($param); $requestParam = array( 'param' => serialize($param), ); $this->getRequestParam($requestParam); $url = $this->getRequestUrl('dml', __FUNCTION__, 'post'); $result = $this->getPostText($url, $requestParam); return json_decode($result, true); }}
使用说明
继承自Dg_Db_Base类型
以YII方式调用
Model::find()->select("*")->where($whereParam)->orderBy($order)->offset($offset)->limit($num)->all()->recordDone();
自定义方式调用
Model::getInstance()->query($where , $order , $limit);
源码
下载源码
阅读全文
0 0
- 微服务之数据库服务-客户端(PHP+YII)
- 微服务之数据库服务-服务端(PHP+YII)
- 微服务架构模式系列文章之四:客户端服务发现
- 微服务之Eureka服务发现
- 微服务之注册服务至EurekaServer
- 【微服务架构】SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
- 【微服务架构】SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
- [我的PHP之旅] YII框架学习 03.连接数据库(使用ActiveRecord)
- Spring Cloud微服务(4)之Ribbon客户端负载均衡
- PHP框架之YII
- Yii之数据库配置
- 微服务架构之spring cloud (二)服务注册与发现
- Spring Cloud微服务(7)之Feign服务之间调用
- 微服务之服务发现的可行方案以及实践案例(四)
- SpringCloud(第 018 篇)Zuul 服务 API 网关微服务之代理与反向代理
- 微服务基础设施之服务注册中心: Spring Cloud Eureka
- 微服务架构模式系列文章之六:服务注册表
- Spring Cloud 微服务框架之服务注册与发现
- Spring IOC源码解析(转载,阅读完后会自己总结出一篇)
- Spark streaming 作业需要注意的问题
- JAVA学习笔记_前台动态生成表格
- 素数判定 (素数)【HDU】-2012
- Token验证实现-JAVA
- 微服务之数据库服务-客户端(PHP+YII)
- Full authentication is required to access this resource
- 点击控件隐藏键盘操作
- 【codeforces 653A】Bear and Three Balls
- EventSystem
- 各种格式时间/日期的显示及转换(C/C++)
- 经典C语言的makefile
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds 错误提示就是我们限定了部署的时间导致的错误。
- ajaxSubmit多文件上传功能