diff --git a/Library/Think/Db.php b/Library/Think/Db.php index 9493df89..62176dc8 100644 --- a/Library/Think/Db.php +++ b/Library/Think/Db.php @@ -1,99 +1,97 @@ - -// +---------------------------------------------------------------------- - -namespace Think; - -/** - * ThinkPHP 数据库中间层实现类 - */ -class Db { - - static private $instance = []; // 数据库连接实例 - static private $_instance = null; // 当前数据库连接实例 - - /** - * 取得数据库类实例 - * @static - * @access public - * @param mixed $config 连接配置 - * @param boolean $lite 是否lite方式 - * @return Object 返回数据库驱动类 - */ - static public function instance($config=[],$lite=false) { - $md5 = md5(serialize($config)); - if(!isset(self::$instance[$md5])) { - // 解析连接参数 支持数组和字符串 - $options = self::parseConfig($config); - // 如果采用lite方式 仅支持原生SQL 包括query和execute方法 - $class = $lite? 'Think\Db\Lite' : 'Think\\Db\\Driver\\'.ucwords($options['dbms']); - self::$instance[$md5] = new $class($options); - } - self::$_instance = self::$instance[$md5]; - return self::$_instance; - } - - /** - * 数据库连接参数解析 - * @static - * @access private - * @param mixed $config - * @return array - */ - static private function parseConfig($config){ - if(empty($config)) { - $config = Config::get('database'); - } - if(is_string($config)) { - return self::parseDsn($config); - }else{ - return $config; - } - } - - /** - * DSN解析 - * 格式: mysql://username:passwd@localhost:3306/DbName?param1=val1¶m2=val2#utf8 - * @static - * @access private - * @param string $dsnStr - * @return array - */ - static private function parseDsn($dsnStr) { - if( empty($dsnStr) ){return false;} - $info = parse_url($dsnStr); - if(!$info) { - return false; - } - $dsn = [ - 'dbms' => $info['scheme'], - 'connection' => [ - 'username' => isset($info['user']) ? $info['user'] : '', - 'password' => isset($info['pass']) ? $info['pass'] : '', - 'hostname' => isset($info['host']) ? $info['host'] : '', - 'hostport' => isset($info['port']) ? $info['port'] : '', - 'database' => isset($info['path']) ? substr($info['path'],1) : '', - ], - 'charset' => isset($info['fragment'])?$info['fragment']:'utf8', - ]; - - if(isset($info['query'])) { - parse_str($info['query'],$dsn['params']); - }else{ - $dsn['params'] = []; - } - return $dsn; - } - - // 调用驱动类的方法 - static public function __callStatic($method, $params){ - return call_user_func_array(array(self::$_instance, $method), $params); - } -} + +// +---------------------------------------------------------------------- + +namespace Think; + +/** + * ThinkPHP 数据库中间层实现类 + */ +class Db { + + static private $instance = []; // 数据库连接实例 + static private $_instance = null; // 当前数据库连接实例 + + /** + * 取得数据库类实例 + * @static + * @access public + * @param mixed $config 连接配置 + * @param boolean $lite 是否lite方式 + * @return Object 返回数据库驱动类 + */ + static public function instance($config=[],$lite=false) { + $md5 = md5(serialize($config)); + if(!isset(self::$instance[$md5])) { + // 解析连接参数 支持数组和字符串 + $options = self::parseConfig($config); + // 如果采用lite方式 仅支持原生SQL 包括query和execute方法 + $class = $lite? 'Think\Db\Lite' : 'Think\\Db\\Driver\\'.ucwords($options['type']); + self::$instance[$md5] = new $class($options); + } + self::$_instance = self::$instance[$md5]; + return self::$_instance; + } + + /** + * 数据库连接参数解析 + * @static + * @access private + * @param mixed $config + * @return array + */ + static private function parseConfig($config){ + if(empty($config)) { + $config = Config::get('database'); + } + if(is_string($config)) { + return self::parseDsn($config); + }else{ + return $config; + } + } + + /** + * DSN解析 + * 格式: mysql://username:passwd@localhost:3306/DbName?param1=val1¶m2=val2#utf8 + * @static + * @access private + * @param string $dsnStr + * @return array + */ + static private function parseDsn($dsnStr) { + if( empty($dsnStr) ){return false;} + $info = parse_url($dsnStr); + if(!$info) { + return false; + } + $dsn = [ + 'type' => $info['scheme'], + 'username' => isset($info['user']) ? $info['user'] : '', + 'password' => isset($info['pass']) ? $info['pass'] : '', + 'hostname' => isset($info['host']) ? $info['host'] : '', + 'hostport' => isset($info['port']) ? $info['port'] : '', + 'database' => isset($info['path']) ? substr($info['path'],1) : '', + 'charset' => isset($info['fragment'])?$info['fragment']:'utf8', + ]; + + if(isset($info['query'])) { + parse_str($info['query'],$dsn['params']); + }else{ + $dsn['params'] = []; + } + return $dsn; + } + + // 调用驱动类的方法 + static public function __callStatic($method, $params){ + return call_user_func_array(array(self::$_instance, $method), $params); + } +} diff --git a/Library/Think/Db/Driver.php b/Library/Think/Db/Driver.php index 2cf31e5c..1c9e7dbb 100644 --- a/Library/Think/Db/Driver.php +++ b/Library/Think/Db/Driver.php @@ -37,16 +37,13 @@ abstract class Driver { protected $_linkID = null; // 数据库连接参数配置 protected $config = [ - 'dbms' => '', // 数据库类型 - 'connection' => [ - 'hostname' => '127.0.0.1', // 服务器地址 - 'database' => '', // 数据库名 - 'username' => 'root', // 用户名 - 'password' => '', // 密码 - 'hostport' => '', // 端口 - 'socket' => '', - 'dsn' => '', // - ], + 'type' => '', // 数据库类型 + 'hostname' => '127.0.0.1', // 服务器地址 + 'database' => '', // 数据库名 + 'username' => '', // 用户名 + 'password' => '', // 密码 + 'hostport' => '', // 端口 + 'dsn' => '', // 'params' => [], // 数据库连接参数 'charset' => 'utf8', // 数据库编码默认采用utf8 'prefix' => '', // 数据库表前缀 @@ -91,12 +88,12 @@ abstract class Driver { */ public function connect($config='',$linkNum=0) { if ( !isset($this->linkID[$linkNum]) ) { - if(empty($config)) $config = $this->config['connection']; + if(empty($config)) $config = $this->config; try{ if(empty($config['dsn'])) { $config['dsn'] = $this->parseDsn($config); } - $this->linkID[$linkNum] = new PDO( $config['dsn'], $config['username'], $config['password'],$this->config['params']); + $this->linkID[$linkNum] = new PDO( $config['dsn'], $config['username'], $config['password'],$config['params']); }catch (\PDOException $e) { E($e->getMessage()); } @@ -989,9 +986,12 @@ abstract class Driver { static $_config = []; if(empty($_config)) { // 缓存分布式数据库配置解析 - foreach ($this->config['connection'] as $key=>$val){ - $_config[$key] = explode(',',$val); - } + $_config['username'] = explode(',',$$this->config['username']); + $_config['password'] = explode(',',$$this->config['password']); + $_config['hostname'] = explode(',',$$this->config['hostname']); + $_config['hostport'] = explode(',',$$this->config['hostport']); + $_config['database'] = explode(',',$$this->config['database']); + $_config['dsn'] = explode(',',$$this->config['dsn']); } // 数据库读写是否分离 if($this->config['rw_separate']){ diff --git a/convention.php b/convention.php index ab90923b..d1de12e5 100644 --- a/convention.php +++ b/convention.php @@ -1,65 +1,62 @@ - -// +---------------------------------------------------------------------- - -// 惯例配置文件 -return [ - 'app_debug' => true, // 调试模式 - 'app_status' => 'debug',// 调试模式状态 - 'var_module' => 'm', // 模块变量名 - 'var_controller' => 'c', // 控制器变量名 - 'var_action' => 'a', // 操作变量名 - 'var_pathinfo' => 's', // PATHINFO变量名 用于兼容模式 - 'pathinfo_fetch' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', - 'pathinfo_depr' => '/', // pathinfo分隔符 - 'require_module' => true, // 是否显示模块 - 'default_module' => 'index', // 默认模块名 - 'require_controller' => true, // 是否显示控制器 - 'default_controller' => 'index', // 默认控制器名 - 'default_action' => 'index', // 默认操作名 - 'action_suffix' => '', // 操作方法后缀 - 'url_model' => 1, // URL模式 - 'base_url' => $_SERVER["SCRIPT_NAME"], // 基础URL路径 - 'url_html_suffix' => '.html', - 'url_params_bind' => false, // url变量绑定 - 'exception_tmpl' => THINK_PATH.'Tpl/think_exception.tpl',// 异常页面的模板文件 - 'error_tmpl' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认错误跳转对应的模板文件 - 'success_tmpl' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认成功跳转对应的模板文件 - 'default_ajax_return' => 'JSON', // 默认AJAX 数据返回格式,可选JSON XML ... - 'default_jsonp_handler' => 'jsonpReturn', // 默认JSONP格式返回的处理方法 - 'var_jsonp_handler' => 'callback', - - /* 错误设置 */ - 'error_message' => '页面错误!请稍后再试~',//错误显示信息,非调试模式有效 - 'error_page' => '', // 错误定向页面 - 'show_error_msg' => false, // 显示错误信息 - - /* 数据库设置 */ - 'database' => [ - 'dbms' => 'mysql', // 数据库类型 - 'connection' => [ - 'dsn' => '', // - 'hostname' => 'localhost', // 服务器地址 - 'database' => '', // 数据库名 - 'username' => 'root', // 用户名 - 'password' => '', // 密码 - 'hostport' => '', // 端口 - 'socket' => '', - ], - 'params' => [], // 数据库连接参数 - 'charset' => 'utf8', // 数据库编码默认采用utf8 - 'prefix' => '', // 数据库表前缀 - 'debug' => false, // 数据库调试模式 - 'deploy' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) - 'rw_separate' => false, // 数据库读写是否分离 主从式有效 - 'master_num' => 1, // 读写分离后 主服务器数量 - 'slave_no' => '', // 指定从服务器序号 - ], -]; + +// +---------------------------------------------------------------------- + +// 惯例配置文件 +return [ + 'app_debug' => true, // 调试模式 + 'app_status' => 'debug',// 调试模式状态 + 'var_module' => 'm', // 模块变量名 + 'var_controller' => 'c', // 控制器变量名 + 'var_action' => 'a', // 操作变量名 + 'var_pathinfo' => 's', // PATHINFO变量名 用于兼容模式 + 'pathinfo_fetch' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', + 'pathinfo_depr' => '/', // pathinfo分隔符 + 'require_module' => true, // 是否显示模块 + 'default_module' => 'index', // 默认模块名 + 'require_controller' => true, // 是否显示控制器 + 'default_controller' => 'index', // 默认控制器名 + 'default_action' => 'index', // 默认操作名 + 'action_suffix' => '', // 操作方法后缀 + 'url_model' => 1, // URL模式 + 'base_url' => $_SERVER["SCRIPT_NAME"], // 基础URL路径 + 'url_html_suffix' => '.html', + 'url_params_bind' => false, // url变量绑定 + 'exception_tmpl' => THINK_PATH.'Tpl/think_exception.tpl',// 异常页面的模板文件 + 'error_tmpl' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认错误跳转对应的模板文件 + 'success_tmpl' => THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认成功跳转对应的模板文件 + 'default_ajax_return' => 'JSON', // 默认AJAX 数据返回格式,可选JSON XML ... + 'default_jsonp_handler' => 'jsonpReturn', // 默认JSONP格式返回的处理方法 + 'var_jsonp_handler' => 'callback', + + /* 错误设置 */ + 'error_message' => '页面错误!请稍后再试~',//错误显示信息,非调试模式有效 + 'error_page' => '', // 错误定向页面 + 'show_error_msg' => false, // 显示错误信息 + + /* 数据库设置 */ + 'database' => [ + 'type' => 'mysql', // 数据库类型 + 'dsn' => '', // + 'hostname' => 'localhost', // 服务器地址 + 'database' => '', // 数据库名 + 'username' => 'root', // 用户名 + 'password' => '', // 密码 + 'hostport' => '', // 端口 + 'params' => [], // 数据库连接参数 + 'charset' => 'utf8', // 数据库编码默认采用utf8 + 'prefix' => '', // 数据库表前缀 + 'debug' => false, // 数据库调试模式 + 'deploy' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) + 'rw_separate' => false, // 数据库读写是否分离 主从式有效 + 'master_num' => 1, // 读写分离后 主服务器数量 + 'slave_no' => '', // 指定从服务器序号 + ], +];