SEPA交易策略中的S、E、P、A分别代表什么

带有多道相关的抛物线Radon变换法分离P_P_P_SV波_冯t_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
带有多道相关的抛物线Radon变换法分离P_P_P_SV波_冯t
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩3页未读,
定制HR最喜欢的简历
你可能喜欢/ qiyezhan
项目语言:PHP
权限:read-only(如需更高权限请先加入项目)
Index: logo.png
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: logo.png
===================================================================
--- logo.png (revision 0)
+++ logo.png (revision 2)
Property changes on: logo.png
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: Conf/convention.php
===================================================================
--- Conf/convention.php (revision 0)
+++ Conf/convention.php (revision 2)
@@ -0,0 +1,145 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+ * ThinkPHP惯例配置文件
+ * 该文件请不要修改,如果要覆盖惯例配置的值,可在项目配置文件中设定和惯例不符的配置项
+ * 配置名称大小写任意,系统会统一转换成小写
+ * 所有配置参数都可以在生效前动态改变
+ * @category Think
+ * @package
+ * @author
liu21st &&
+ * @version
$Id: convention.php -29 09:12:19Z
+defined('THINK_PATH') or exit();
/* 项目设定 */
'APP_STATUS'
=& 'debug',
// 应用调试模式状态 调试模式开启后有效 默认为debug 可扩展 并自动加载对应的配置文件
'APP_FILE_CASE'
// 是否检查文件的大小写 对Windows平台有效
'APP_AUTOLOAD_PATH'
=& '',// 自动加载机制的自动搜索路径,注意搜索顺序
'APP_TAGS_ON'
=& true, // 系统标签扩展开关
'APP_SUB_DOMAIN_DEPLOY' =& false,
// 是否开启子域名部署
'APP_SUB_DOMAIN_RULES'
=& array(), // 子域名部署规则
'APP_SUB_DOMAIN_DENY'
=& array(), //
子域名禁用列表
'APP_GROUP_LIST'
=& '',
// 项目分组设定,多个组之间用逗号分隔,例如'Home,Admin'
'APP_GROUP_MODE'
// 分组模式 0 普通分组 1 独立分组
'APP_GROUP_PATH'
'Modules', // 分组目录 独立分组模式下面有效
'ACTION_SUFFIX'
'', // 操作方法后缀
/* Cookie设置 */
'COOKIE_EXPIRE'
// Coodie有效期
'COOKIE_DOMAIN'
=& '',
// Cookie有效域名
'COOKIE_PATH'
=& '/',
// Cookie路径
'COOKIE_PREFIX'
=& '',
// Cookie前缀 避免冲突
/* 默认设定 */
'DEFAULT_M_LAYER'
'Model', // 默认的模型层名称
'DEFAULT_C_LAYER'
'Action', // 默认的控制器层名称
'DEFAULT_V_LAYER'
'Tpl', // 默认的视图层名称
'DEFAULT_APP'
=& '@',
// 默认项目名称,@表示当前项目
'DEFAULT_LANG'
=& 'zh-cn', // 默认语言
'DEFAULT_THEME'
=& '', // 默认模板主题名称
'DEFAULT_GROUP'
=& 'Home',
// 默认分组
'DEFAULT_MODULE'
=& 'Index', // 默认模块名称
'DEFAULT_ACTION'
=& 'index', // 默认操作名称
'DEFAULT_CHARSET'
=& 'utf-8', // 默认输出编码
'DEFAULT_TIMEZONE'
=& 'PRC', // 默认时区
'DEFAULT_AJAX_RETURN'
=& 'JSON',
// 默认AJAX 数据返回格式,可选JSON XML ...
'DEFAULT_JSONP_HANDLER' =& 'jsonpReturn', // 默认JSONP格式返回的处理方法
'DEFAULT_FILTER'
=& 'htmlspecialchars', // 默认参数过滤方法 用于 $this-&_get('变量名');$this-&_post('变量名')...
/* 数据库设置 */
'DB_TYPE'
=& 'mysql',
// 数据库类型
'DB_HOST'
=& 'localhost', // 服务器地址
'DB_NAME'
=& '',
// 数据库名
'DB_USER'
=& 'root',
'DB_PWD'
=& '',
'DB_PORT'
=& '',
'DB_PREFIX'
=& 'think_',
// 数据库表前缀
'DB_FIELDTYPE_CHECK'
// 是否进行字段类型检查
'DB_FIELDS_CACHE'
// 启用字段缓存
'DB_CHARSET'
=& 'utf8',
// 数据库编码默认采用utf8
'DB_DEPLOY_TYPE'
=& 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'DB_RW_SEPARATE'
// 数据库读写是否分离 主从式有效
'DB_MASTER_NUM'
=& 1, // 读写分离后 主服务器数量
'DB_SLAVE_NO'
=& '', // 指定从服务器序号
'DB_SQL_BUILD_CACHE'
=& false, // 数据库查询的SQL创建缓存
'DB_SQL_BUILD_QUEUE'
=& 'file',
// SQL缓存队列的缓存方式 支持 file xcache和apc
'DB_SQL_BUILD_LENGTH'
=& 20, // SQL缓存的队列长度
'DB_SQL_LOG'
=& false, // SQL执行日志记录
/* 数据缓存设置 */
'DATA_CACHE_TIME'
// 数据缓存有效期 0表示永久缓存
'DATA_CACHE_COMPRESS'
// 数据缓存是否压缩缓存
'DATA_CACHE_CHECK'
// 数据缓存是否校验缓存
'DATA_CACHE_PREFIX'
=& '',
// 缓存前缀
'DATA_CACHE_TYPE'
=& 'File',
// 数据缓存类型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator
'DATA_CACHE_PATH'
=& TEMP_PATH,// 缓存路径设置 (仅对File方式缓存有效)
'DATA_CACHE_SUBDIR'
// 使用子目录缓存 (自动根据缓存标识的哈希创建子目录)
'DATA_PATH_LEVEL'
// 子目录缓存级别
/* 错误设置 */
'ERROR_MESSAGE'
=& '页面错误!请稍后再试~',//错误显示信息,非调试模式有效
'ERROR_PAGE'
=& '', // 错误定向页面
'SHOW_ERROR_MSG'
// 显示错误信息
'TRACE_EXCEPTION'
// TRACE错误信息是否抛异常 针对trace方法
/* 日志设置 */
'LOG_RECORD'
// 默认不记录日志
'LOG_TYPE'
=& 3, // 日志记录类型 0 系统 1 邮件 3 文件 4 SAPI 默认为文件方式
'LOG_DEST'
=& '', // 日志记录目标
'LOG_EXTRA'
=& '', // 日志记录额外信息
'LOG_LEVEL'
=& 'EMERG,ALERT,CRIT,ERR',// 允许记录的日志级别
'LOG_FILE_SIZE'
=& 2097152, // 日志文件大小限制
'LOG_EXCEPTION_RECORD'
// 是否记录异常信息日志
/* SESSION设置 */
'SESSION_AUTO_START'
// 是否自动开启Session
'SESSION_OPTIONS'
=& array(), // session 配置数组 支持type name id path expire domain 等参数
'SESSION_TYPE'
=& '', // session hander类型 默认无需设置 除非扩展了session hander驱动
'SESSION_PREFIX'
=& '', // session 前缀
//'VAR_SESSION_ID'
=& 'session_id',
//sessionID的提交变量
/* 模板引擎设置 */
'TMPL_CONTENT_TYPE'
=& 'text/html', // 默认模板输出类型
'TMPL_ACTION_ERROR'
=& THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认错误跳转对应的模板文件
'TMPL_ACTION_SUCCESS'
=& THINK_PATH.'Tpl/dispatch_jump.tpl', // 默认成功跳转对应的模板文件
'TMPL_EXCEPTION_FILE'
=& THINK_PATH.'Tpl/think_exception.tpl',// 异常页面的模板文件
'TMPL_DETECT_THEME'
// 自动侦测模板主题
'TMPL_TEMPLATE_SUFFIX'
=& '.html',
// 默认模板文件后缀
'TMPL_FILE_DEPR'
'/', //模板文件MODULE_NAME与ACTION_NAME之间的分割符
/* URL设置 */
'URL_CASE_INSENSITIVE'
// 默认false 表示URL区分大小写 true则表示不区分大小写
'URL_MODEL'
// URL访问模式,可选参数0、1、2、3,代表以下四种模式:
// 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE
模式); 3 (兼容模式)
默认为PATHINFO 模式,提供最好的用户体验和SEO支持
'URL_PATHINFO_DEPR'
=& '/', // PATHINFO模式下,各参数之间的分割符号
'URL_PATHINFO_FETCH'
'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', // 用于兼容判断PATH_INFO 参数的SERVER替代变量列表
'URL_HTML_SUFFIX'
=& 'html',
// URL伪静态后缀设置
'URL_DENY_SUFFIX'
'ico|png|gif|jpg', // URL禁止访问的后缀设置
'URL_PARAMS_BIND'
true, // URL变量绑定到Action方法参数
'URL_404_REDIRECT'
'', // 404 跳转页面 部署模式有效
/* 系统变量名称设置 */
'VAR_GROUP'
=& 'g',
// 默认分组获取变量
'VAR_MODULE'
=& 'm',
// 默认模块获取变量
'VAR_ACTION'
=& 'a',
// 默认操作获取变量
'VAR_AJAX_SUBMIT'
=& 'ajax',
// 默认的AJAX提交变量
+ 'VAR_JSONP_HANDLER'
=& 'callback',
'VAR_PATHINFO'
=& 's', // PATHINFO 兼容模式获取变量例如 ?s=/module/action/id/1 后面的参数取决于URL_PATHINFO_DEPR
'VAR_URL_PARAMS'
=& '_URL_', // PATHINFO URL参数变量
'VAR_TEMPLATE'
=& 't',
// 默认模板切换变量
'VAR_FILTERS'
'filter_exp',
// 全局系统变量的默认过滤方法 多个用逗号分割
'OUTPUT_ENCODE'
false, // 页面压缩输出
'HTTP_CACHE_CONTROL'
'private', // 网页缓存控制
\ No newline at end of file
Index: Conf/debug.php
===================================================================
--- Conf/debug.php (revision 0)
+++ Conf/debug.php (revision 2)
@@ -0,0 +1,32 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+ * ThinkPHP 默认的调试模式配置文件
如果项目有定义自己的调试模式配置文件,本文件无效
+ * @category
+ * @package
+ * @author
liu21st &&
+ * @version
$Id: debug.php -15 07:59:23Z
+defined('THINK_PATH') or exit();
+// 调试模式下面默认设置 可以在项目配置目录下重新定义 debug.php 覆盖
'LOG_RECORD'
// 进行日志记录
'LOG_EXCEPTION_RECORD'
// 是否记录异常信息日志
'LOG_LEVEL'
'EMERG,ALERT,CRIT,ERR,WARN,NOTIC,INFO,DEBUG,SQL',
// 允许记录的日志级别
'DB_FIELDS_CACHE'
false, // 字段缓存信息
'DB_SQL_LOG'
=& true, // 记录SQL信息
'APP_FILE_CASE'
true, // 是否检查文件的大小写 对Windows平台有效
'TMPL_CACHE_ON'
// 是否开启模板编译缓存,设为false则每次都会重新编译
'TMPL_STRIP_SPACE'
// 是否去除模板文件里面的html空格与换行
'SHOW_ERROR_MSG'
// 显示错误信息
\ No newline at end of file
Index: Conf/alias.php
===================================================================
--- Conf/alias.php (revision 0)
+++ Conf/alias.php (revision 2)
@@ -0,0 +1,23 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+// 系统别名定义文件
+return array(
'Model'
=& CORE_PATH.'Core/Model.class.php',
'Db'
=& CORE_PATH.'Core/Db.class.php',
'Log'
=& CORE_PATH.'Core/Log.class.php',
'ThinkTemplate' =& CORE_PATH.'Template/ThinkTemplate.class.php',
'TagLib'
=& CORE_PATH.'Template/TagLib.class.php',
'Cache'
=& CORE_PATH.'Core/Cache.class.php',
'Widget'
=& CORE_PATH.'Core/Widget.class.php',
'TagLibCx'
=& CORE_PATH.'Driver/TagLib/TagLibCx.class.php',
\ No newline at end of file
Index: Conf/tags.php
===================================================================
--- Conf/tags.php (revision 0)
+++ Conf/tags.php (revision 2)
@@ -0,0 +1,39 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+// 系统默认的核心行为扩展列表文件
+return array(
'app_init'
'app_begin'
'ReadHtmlCache', // 读取静态缓存
'route_check'
'CheckRoute', // 路由检测
'app_end'
'path_info'
'action_begin'
'action_end'
'view_begin'
'view_parse'
'ParseTemplate', // 模板解析 支持PHP、内置模板引擎和第三方模板引擎
'view_filter'
'ContentReplace', // 模板输出替换
'TokenBuild',
// 表单令牌
'WriteHtmlCache', // 写入静态缓存
'ShowRuntime', // 运行时间显示
'view_end'
'ShowPageTrace', // 页面Trace显示
\ No newline at end of file
Index: Lib/Behavior/ContentReplaceBehavior.class.php
===================================================================
--- Lib/Behavior/ContentReplaceBehavior.class.php (revision 0)
+++ Lib/Behavior/ContentReplaceBehavior.class.php (revision 2)
@@ -0,0 +1,57 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:模板内容输出替换
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class ContentReplaceBehavior extends Behavior {
// 行为参数定义
protected $options
'TMPL_PARSE_STRING' =&
// 行为扩展的执行入口必须是run
public function run(&$content){
$content = $this-&templateContentReplace($content);
* 模板内容替换
* @access protected
* @param string $content 模板内容
* @return string
protected function templateContentReplace($content) {
// 系统默认的特殊变量替换
$replace =
'__TMPL__'
APP_TMPL_PATH,
// 项目模板目录
'__ROOT__'
// 当前网站地址
'__APP__'
// 当前项目地址
'__GROUP__'
defined('GROUP_NAME')?__GROUP__:__APP__,
'__ACTION__'
__ACTION__,
// 当前操作地址
'__SELF__'
// 当前页面地址
'__URL__'
'../Public'
APP_TMPL_PATH.'Public',// 项目公共模板目录
'__PUBLIC__'
__ROOT__.'/Public',// 站点公共目录
// 允许用户自定义模板的字符串替换
if(is_array(C('TMPL_PARSE_STRING')) )
$replace =
array_merge($replace,C('TMPL_PARSE_STRING'));
$content = str_replace(array_keys($replace),array_values($replace),$content);
\ No newline at end of file
Index: Lib/Behavior/ParseTemplateBehavior.class.php
===================================================================
--- Lib/Behavior/ParseTemplateBehavior.class.php (revision 0)
+++ Lib/Behavior/ParseTemplateBehavior.class.php (revision 2)
@@ -0,0 +1,121 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:模板解析
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class ParseTemplateBehavior extends Behavior {
// 行为参数定义(默认值) 可在项目配置中覆盖
protected $options
// 布局设置
'TMPL_ENGINE_TYPE'
'Think',
// 默认模板引擎 以下设置仅对使用Think模板引擎有效
'TMPL_CACHFILE_SUFFIX'
'.php',
// 默认模板缓存后缀
'TMPL_DENY_FUNC_LIST' =&
'echo,exit', // 模板引擎禁用函数
'TMPL_DENY_PHP'
false, // 默认模板引擎是否禁用PHP原生代码
'TMPL_L_DELIM'
'{',
// 模板引擎普通标签开始标记
'TMPL_R_DELIM'
'}',
// 模板引擎普通标签结束标记
'TMPL_VAR_IDENTIFY'
'array',
// 模板变量识别。留空自动判断,参数为'obj'则表示对象
'TMPL_STRIP_SPACE'
// 是否去除模板文件里面的html空格与换行
'TMPL_CACHE_ON'
// 是否开启模板编译缓存,设为false则每次都会重新编译
'TMPL_CACHE_PREFIX'
'',
// 模板缓存前缀标识,可以动态改变
'TMPL_CACHE_TIME'
// 模板缓存有效期 0 为永久,(以数字为值,单位:秒)
'TMPL_LAYOUT_ITEM'
'{__CONTENT__}', // 布局模板的内容替换标识
'LAYOUT_ON'
false, // 是否启用布局
'LAYOUT_NAME'
'layout', // 当前布局名称 默认为layout
// Think模板引擎标签库相关设定
'TAGLIB_BEGIN'
'&',
// 标签库标签开始标记
'TAGLIB_END'
'&',
// 标签库标签结束标记
'TAGLIB_LOAD'
true, // 是否使用内置标签库之外的其它标签库,默认自动检测
'TAGLIB_BUILD_IN'
'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序
'TAGLIB_PRE_LOAD'
'',
// 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔
// 行为扩展的执行入口必须是run
public function run(&$_data){
strtolower(C('TMPL_ENGINE_TYPE'));
empty($_data['content'])?$_data['file']:$_data['content'];
$_data['prefix']
!empty($_data['prefix'])?$_data['prefix']:C('TMPL_CACHE_PREFIX');
if('think'==$engine){ // 采用Think模板引擎
if((!empty($_data['content']) && $this-&checkContentCache($_data['content'],$_data['prefix']))
$this-&checkCache($_data['file'],$_data['prefix'])) { // 缓存有效
// 分解变量并载入模板缓存
extract($_data['var'], EXTR_OVERWRITE);
//载入模版缓存文件
include C('CACHE_PATH').$_data['prefix'].md5($_content).C('TMPL_CACHFILE_SUFFIX');
$tpl = Think::instance('ThinkTemplate');
// 编译并加载模板文件
$tpl-&fetch($_content,$_data['var'],$_data['prefix']);
// 调用第三方模板引擎解析和输出
= 'Template'.ucwords($engine);
if(class_exists($class)) {
$tpl-&fetch($_content,$_data['var']);
// 类没有定义
throw_exception(L('_NOT_SUPPERT_').': ' . $class);
* 检查缓存文件是否有效
* 如果无效则需要重新编译
* @access public
* @param string $tmplTemplateFile
模板文件名
* @return boolean
protected function checkCache($tmplTemplateFile,$prefix='') {
if (!C('TMPL_CACHE_ON')) // 优先对配置设定检测
$tmplCacheFile = C('CACHE_PATH').$prefix.md5($tmplTemplateFile).C('TMPL_CACHFILE_SUFFIX');
if(!is_file($tmplCacheFile)){
}elseif (filemtime($tmplTemplateFile) & filemtime($tmplCacheFile)) {
// 模板文件如果有更新则缓存需要更新
}elseif (C('TMPL_CACHE_TIME') != 0 && time() & filemtime($tmplCacheFile)+C('TMPL_CACHE_TIME')) {
// 缓存是否在有效期
// 开启布局模板
if(C('LAYOUT_ON')) {
$layoutFile
THEME_PATH.C('LAYOUT_NAME').C('TMPL_TEMPLATE_SUFFIX');
if(filemtime($layoutFile) & filemtime($tmplCacheFile)) {
// 缓存有效
* 检查缓存内容是否有效
* 如果无效则需要重新编译
* @access public
* @param string $tmplContent
* @return boolean
protected function checkContentCache($tmplContent,$prefix='') {
if(is_file(C('CACHE_PATH').$prefix.md5($tmplContent).C('TMPL_CACHFILE_SUFFIX'))){
\ No newline at end of file
Index: Lib/Behavior/CheckRouteBehavior.class.php
===================================================================
--- Lib/Behavior/CheckRouteBehavior.class.php (revision 0)
+++ Lib/Behavior/CheckRouteBehavior.class.php (revision 2)
@@ -0,0 +1,212 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:路由检测
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class CheckRouteBehavior extends Behavior {
// 行为参数定义(默认值) 可在项目配置中覆盖
protected $options
'URL_ROUTER_ON'
// 是否开启URL路由
'URL_ROUTE_RULES'
=& array(), // 默认路由规则,注:分组配置无法替代
// 行为扩展的执行入口必须是run
public function run(&$return){
// 优先检测是否存在PATH_INFO
$regx = trim($_SERVER['PATH_INFO'],'/');
if(empty($regx)) return $return =
// 是否开启路由使用
if(!C('URL_ROUTER_ON')) return $return =
// 路由定义文件优先于config中的配置定义
$routes = C('URL_ROUTE_RULES');
// 路由处理
if(!empty($routes)) {
$depr = C('URL_PATHINFO_DEPR');
// 分隔符替换 确保路由定义使用统一的分隔符
$regx = str_replace($depr,'/',$regx);
foreach ($routes as $rule=&$route){
if(0===strpos($rule,'/') && preg_match($rule,$regx,$matches)) { // 正则路由
return $return = $this-&parseRegex($matches,$route,$regx);
}else{ // 规则路由
substr_count($regx,'/');
substr_count($rule,'/');
if($len1&=$len2) {
if('$' == substr($rule,-1,1)) {// 完整匹配
if($len1 != $len2) {
substr($rule,0,-1);
$this-&checkUrlMatch($regx,$rule);
if($match)
return $return = $this-&parseRule($rule,$route,$regx);
// 检测URL和规则路由是否匹配
private function checkUrlMatch($regx,$rule) {
$m1 = explode('/',$regx);
$m2 = explode('/',$rule);
$match = // 是否匹配
foreach ($m2 as $key=&$val){
if(':' == substr($val,0,1)) {// 动态变量
if(strpos($val,'\\')) {
$type = substr($val,-1);
if('d'==$type && !is_numeric($m1[$key])) {
}elseif(strpos($val,'^')){
explode('|',substr(strstr($val,'^'),1));
if(in_array($m1[$key],$array)) {
}elseif(0 !== strcasecmp($val,$m1[$key])){
// 解析规范的路由地址
// 地址格式 [分组/模块/操作?]参数1=值1&参数2=值2...
private function parseUrl($url) {
if(false !== strpos($url,'?')) { // [分组/模块/操作?]参数1=值1&参数2=值2...
parse_url($url);
= explode('/',$info['path']);
parse_str($info['query'],$var);
}elseif(strpos($url,'/')){ // [分组/模块/操作]
$path = explode('/',$url);
}else{ // 参数1=值1&参数2=值2...
parse_str($url,$var);
if(isset($path)) {
$var[C('VAR_ACTION')] = array_pop($path);
if(!empty($path)) {
$var[C('VAR_MODULE')] = array_pop($path);
if(!empty($path)) {
$var[C('VAR_GROUP')]
= array_pop($path);
// 解析规则路由
// '路由规则'=&'[分组/模块/操作]?额外参数1=值1&额外参数2=值2...'
// '路由规则'=&array('[分组/模块/操作]','额外参数1=值1&额外参数2=值2...')
// '路由规则'=&'外部地址'
// '路由规则'=&array('外部地址','重定向代码')
// 路由规则中 :开头 表示动态变量
// 外部地址中可以用动态变量 采用 :1 :2 的方式
// 'news/:month/:day/:id'=&array('News/read?cate=1','status=1'),
// 'new/:id'=&array('/new.php?id=:1',301), 重定向
private function parseRule($rule,$route,$regx) {
// 获取路由地址规则
is_array($route)?$route[0]:$
// 获取URL地址中的参数
$paths = explode('/',$regx);
// 解析路由规则
explode('/',$rule);
foreach ($rule as $item){
if(0===strpos($item,':')) { // 动态变量获取
if($pos = strpos($item,'^') ) {
substr($item,1,$pos-1);
}elseif(strpos($item,'\\')){
substr($item,1,-2);
substr($item,1);
$matches[$var] = array_shift($paths);
}else{ // 过滤URL中的静态变量
array_shift($paths);
if(0=== strpos($url,'/') || 0===strpos($url,'http')) { // 路由重定向跳转
if(strpos($url,':')) { // 传递动态参数
array_values($matches);
preg_replace('/:(\d+)/e','$values[\\1-1]',$url);
header(&Location: $url&, true,(is_array($route) && isset($route[1]))?$route[1]:301);
// 解析路由地址
$this-&parseUrl($url);
// 解析路由地址里面的动态参数
array_values($matches);
foreach ($var as $key=&$val){
if(0===strpos($val,':')) {
$var[$key] =
$values[substr($val,1)-1];
array_merge($matches,$var);
// 解析剩余的URL参数
if($paths) {
preg_replace('@(\w+)\/([^\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', implode('/',$paths));
// 解析路由自动传入参数
if(is_array($route) && isset($route[1])) {
parse_str($route[1],$params);
array_merge($var,$params);
array_merge($var,$_GET);
// 解析正则路由
// '路由正则'=&'[分组/模块/操作]?参数1=值1&参数2=值2...'
// '路由正则'=&array('[分组/模块/操作]?参数1=值1&参数2=值2...','额外参数1=值1&额外参数2=值2...')
// '路由正则'=&'外部地址'
// '路由正则'=&array('外部地址','重定向代码')
// 参数值和外部地址中可以用动态变量 采用 :1 :2 的方式
// '/new\/(\d+)\/(\d+)/'=&array('News/read?id=:1&page=:2&cate=1','status=1'),
// '/new\/(\d+)/'=&array('/new.php?id=:1&page=:2&status=1','301'), 重定向
private function parseRegex($matches,$route,$regx) {
// 获取路由地址规则
is_array($route)?$route[0]:$
preg_replace('/:(\d+)/e','$matches[\\1]',$url);
if(0=== strpos($url,'/') || 0===strpos($url,'http')) { // 路由重定向跳转
header(&Location: $url&, true,(is_array($route) && isset($route[1]))?$route[1]:301);
// 解析路由地址
$this-&parseUrl($url);
// 解析剩余的URL参数
substr_replace($regx,'',0,strlen($matches[0]));
if($regx) {
preg_replace('@(\w+)\/([^,\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', $regx);
// 解析路由自动传入参数
if(is_array($route) && isset($route[1])) {
parse_str($route[1],$params);
array_merge($var,$params);
array_merge($var,$_GET);
\ No newline at end of file
Index: Lib/Behavior/ShowPageTraceBehavior.class.php
===================================================================
--- Lib/Behavior/ShowPageTraceBehavior.class.php (revision 0)
+++ Lib/Behavior/ShowPageTraceBehavior.class.php (revision 2)
@@ -0,0 +1,128 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:页面Trace显示输出
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class ShowPageTraceBehavior extends Behavior {
// 行为参数定义
protected $options
'SHOW_PAGE_TRACE'
// 显示页面Trace信息
'TRACE_PAGE_TABS'
=& array('BASE'=&'基本','FILE'=&'文件','INFO'=&'流程','ERR|NOTIC'=&'错误','SQL'=&'SQL','DEBUG'=&'调试'), // 页面Trace可定制的选项卡
'PAGE_TRACE_SAVE'
// 行为扩展的执行入口必须是run
public function run(&$params){
if(!IS_AJAX && C('SHOW_PAGE_TRACE')) {
echo $this-&showTrace();
* 显示页面Trace信息
* @access private
private function showTrace() {
// 系统默认显示信息
get_included_files();
foreach ($files as $key=&$file){
$info[] = $file.' ( '.number_format(filesize($file)/1024,2).' KB )';
'请求信息'
date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']).' '.$_SERVER['SERVER_PROTOCOL'].' '.$_SERVER['REQUEST_METHOD'].' : '.__SELF__,
'运行时间'
$this-&showTime(),
'吞吐率' =& number_format(1/G('beginTime','viewEndTime'),2).'req/s',
'内存开销'
MEMORY_LIMIT_ON?number_format((memory_get_usage() - $GLOBALS['_startUseMems'])/1024,2).' kb':'不支持',
'查询信息'
N('db_query').' queries '.N('db_write').' writes ',
'文件加载'
count(get_included_files()),
'缓存信息'
N('cache_read').' gets '.N('cache_write').' writes ',
'配置加载'
count(c()),
'会话信息'
'SESSION_ID='.session_id(),
// 读取项目定义的Trace文件
$traceFile
CONF_PATH.'trace.php';
if(is_file($traceFile)) {
array_merge($base,include $traceFile);
C('TRACE_PAGE_TABS');
foreach ($tabs as $name=&$title){
switch(strtoupper($name)) {
case 'BASE':// 基本信息
$trace[$title]
case 'FILE': // 文件信息
$trace[$title]
default:// 调试信息
strtoupper($name);
if(strpos($name,'|')) {// 多组信息
explode('|',$name);
foreach($array as $name){
isset($debug[$name])?$debug[$name]:array();
$trace[$title]
$trace[$title]
isset($debug[$name])?$debug[$name]:'';
if($save = C('PAGE_TRACE_SAVE')) { // 保存页面Trace日志
if(is_array($save)) {// 选择选项卡保存
C('TRACE_PAGE_TABS');
foreach ($save as $tab){
$array[] =
$tabs[$tab];
date('[ c ]').' '.get_client_ip().' '.$_SERVER['REQUEST_URI'].&\r\n&;
foreach ($trace as $key=&$val){
if(!isset($array) || in_array($key,$array)) {
'[ '.$key.& ]\r\n&;
if(is_array($val)) {
foreach ($val as $k=&$v){
$content .= (!is_numeric($k)?$k.':':'').print_r($v,true).&\r\n&;
$content .= print_r($val,true).&\r\n&;
$content .= &\r\n&;
error_log(str_replace('&br/&',&\r\n&,$content), Log::FILE,LOG_PATH.date('y_m_d').'_trace.log');
unset($files,$info,$base);
// 调用Trace页面模板
ob_start();
include C('TMPL_TRACE_FILE')?C('TMPL_TRACE_FILE'):THINK_PATH.'Tpl/page_trace.tpl';
return ob_get_clean();
* 获取运行时间
private function showTime() {
// 显示运行时间
G('beginTime',$GLOBALS['_beginTime']);
G('viewEndTime');
// 显示详细运行时间
return G('beginTime','viewEndTime').'s ( Load:'.G('beginTime','loadTime').'s Init:'.G('loadTime','initTime').'s Exec:'.G('initTime','viewStartTime').'s Template:'.G('viewStartTime','viewEndTime').'s )';
Index: Lib/Behavior/TokenBuildBehavior.class.php
===================================================================
--- Lib/Behavior/TokenBuildBehavior.class.php (revision 0)
+++ Lib/Behavior/TokenBuildBehavior.class.php (revision 2)
@@ -0,0 +1,61 @@
+// +----------------------------------------------------------------------
+// | TOPThink [ WE CAN DO IT JUST THINK ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2010 http://topthink.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:表单令牌生成
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class TokenBuildBehavior extends Behavior {
// 行为参数定义
protected $options
'TOKEN_ON'
// 开启令牌验证
'TOKEN_NAME'
=& '__hash__',
// 令牌验证的表单隐藏字段名称
'TOKEN_TYPE'
=& 'md5',
// 令牌验证哈希规则
'TOKEN_RESET'
=& true, // 令牌错误后是否重置
public function run(&$content){
if(C('TOKEN_ON')) {
if(strpos($content,'{__TOKEN__}')) {
// 指定表单令牌隐藏域位置
$content = str_replace('{__TOKEN__}',$this-&buildToken(),$content);
}elseif(preg_match('/&\/form(\s*)&/is',$content,$match)) {
// 智能生成表单令牌隐藏域
$content = str_replace($match[0],$this-&buildToken().$match[0],$content);
$content = str_replace('{__TOKEN__}','',$content);
// 创建表单令牌
private function buildToken() {
$tokenName
= C('TOKEN_NAME');
$tokenType
= C('TOKEN_TYPE');
if(!isset($_SESSION[$tokenName])) {
$_SESSION[$tokenName]
= array();
// 标识当前页面唯一性
md5($_SERVER['REQUEST_URI']);
if(isset($_SESSION[$tokenName][$tokenKey])) {// 相同页面不重复生成session
$tokenValue = $_SESSION[$tokenName][$tokenKey];
$tokenValue = $tokenType(microtime(TRUE));
$_SESSION[$tokenName][$tokenKey]
'&input type=&hidden& name=&'.$tokenName.'& value=&'.$tokenKey.'_'.$tokenValue.'& /&';
\ No newline at end of file
Index: Lib/Behavior/WriteHtmlCacheBehavior.class.php
===================================================================
--- Lib/Behavior/WriteHtmlCacheBehavior.class.php (revision 0)
+++ Lib/Behavior/WriteHtmlCacheBehavior.class.php (revision 2)
@@ -0,0 +1,34 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:静态缓存写入
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class WriteHtmlCacheBehavior extends Behavior {
// 行为扩展的执行入口必须是run
public function run(&$content){
if(C('HTML_CACHE_ON') && defined('HTML_FILE_NAME'))
//静态文件写入
// 如果开启HTML功能 检查并重写HTML文件
// 没有模版的操作不生成静态文件
if(!is_dir(dirname(HTML_FILE_NAME)))
mkdir(dirname(HTML_FILE_NAME),0755,true);
if( false === file_put_contents( HTML_FILE_NAME , $content ))
throw_exception(L('_CACHE_WRITE_ERROR_').':'.HTML_FILE_NAME);
\ No newline at end of file
Index: Lib/Behavior/ReadHtmlCacheBehavior.class.php
===================================================================
--- Lib/Behavior/ReadHtmlCacheBehavior.class.php (revision 0)
+++ Lib/Behavior/ReadHtmlCacheBehavior.class.php (revision 2)
@@ -0,0 +1,123 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:静态缓存读取
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class ReadHtmlCacheBehavior extends Behavior {
protected $options
'HTML_CACHE_ON'
'HTML_CACHE_TIME'
'HTML_CACHE_RULES'
'HTML_FILE_SUFFIX'
'.html',
// 行为扩展的执行入口必须是run
public function run(&$params){
// 开启静态缓存
if(C('HTML_CACHE_ON'))
$cacheTime = $this-&requireHtmlCache();
if( false !== $cacheTime && $this-&checkHTMLCache(HTML_FILE_NAME,$cacheTime)) { //静态页面有效
// 读取静态页面输出
readfile(HTML_FILE_NAME);
// 判断是否需要静态缓存
static private function requireHtmlCache() {
// 分析当前的静态规则
$htmls = C('HTML_CACHE_RULES'); // 读取静态规则
if(!empty($htmls)) {
$htmls = array_change_key_case($htmls);
// 静态规则文件定义格式 actionName=&array('静态规则','缓存时间','附加规则')
// 'read'=&array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性
// 检测静态规则
$moduleName = strtolower(MODULE_NAME);
$actionName = strtolower(ACTION_NAME);
if(isset($htmls[$moduleName.':'.$actionName])) {
$htmls[$moduleName.':'.$actionName];
// 某个模块的操作的静态规则
}elseif(isset($htmls[$moduleName.':'])){// 某个模块的静态规则
$htmls[$moduleName.':'];
}elseif(isset($htmls[$actionName])){
$htmls[$actionName]; // 所有操作的静态规则
}elseif(isset($htmls['*'])){
$htmls['*']; // 全局静态规则
}elseif(isset($htmls['empty:index']) && !class_exists(MODULE_NAME.'Action')){
$htmls['empty:index']; // 空模块静态规则
}elseif(isset($htmls[$moduleName.':_empty']) && self::isEmptyAction(MODULE_NAME,ACTION_NAME)){
$htmls[$moduleName.':_empty']; // 空操作静态规则
if(!empty($html)) {
// 解读静态规则
= $html[0];
// 以$_开头的系统变量
= preg_replace('/{\$(_\w+)\.(\w+)\|(\w+)}/e',&\\3(\$\\1['\\2'])&,$rule);
= preg_replace('/{\$(_\w+)\.(\w+)}/e',&\$\\1['\\2']&,$rule);
// {ID|FUN} GET变量的简写
= preg_replace('/{(\w+)\|(\w+)}/e',&\\2(\$_GET['\\1'])&,$rule);
= preg_replace('/{(\w+)}/e',&\$_GET['\\1']&,$rule);
// 特殊系统变量
= str_ireplace(
array('{:app}','{:module}','{:action}','{:group}'),
array(APP_NAME,MODULE_NAME,ACTION_NAME,defined('GROUP_NAME')?GROUP_NAME:''),
// {|FUN} 单独使用函数
= preg_replace('/{|(\w+)}/e',&\\1()&,$rule);
if(!empty($html[2])) $rule
$html[2]($rule); // 应用附加函数
$cacheTime = isset($html[1])?$html[1]:C('HTML_CACHE_TIME'); // 缓存有效期
// 当前缓存文件
define('HTML_FILE_NAME',HTML_PATH . $rule.C('HTML_FILE_SUFFIX'));
return $cacheT
// 无需缓存
* 检查静态HTML文件是否有效
* 如果无效需要重新更新
* @access public
* @param string $cacheFile
静态文件名
* @param integer $cacheTime
缓存有效期
* @return boolean
static public function checkHTMLCache($cacheFile='',$cacheTime='') {
if(!is_file($cacheFile)){
}elseif (filemtime(C('TEMPLATE_NAME')) & filemtime($cacheFile)) {
// 模板文件如果更新静态文件需要更新
}elseif(!is_numeric($cacheTime) && function_exists($cacheTime)){
return $cacheTime($cacheFile);
}elseif ($cacheTime != 0 && NOW_TIME & filemtime($cacheFile)+$cacheTime) {
// 文件是否在有效期
//静态文件有效
//检测是否是空操作
static private function isEmptyAction($module,$action) {
$className
$module.'Action';
new $classN
return !method_exists($class,$action);
\ No newline at end of file
Index: Lib/Behavior/ShowRuntimeBehavior.class.php
===================================================================
--- Lib/Behavior/ShowRuntimeBehavior.class.php (revision 0)
+++ Lib/Behavior/ShowRuntimeBehavior.class.php (revision 2)
@@ -0,0 +1,84 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+defined('THINK_PATH') or exit();
+ * 系统行为扩展:运行时间信息显示
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class ShowRuntimeBehavior extends Behavior {
// 行为参数定义
protected $options
'SHOW_RUN_TIME'
// 运行时间显示
'SHOW_ADV_TIME'
// 显示详细的运行时间
'SHOW_DB_TIMES'
// 显示数据库查询和写入次数
'SHOW_CACHE_TIMES' =& false,
// 显示缓存操作次数
'SHOW_USE_MEM'
// 显示内存开销
'SHOW_LOAD_FILE'
// 显示加载文件数
'SHOW_FUN_TIMES'
=& false ,
// 显示函数调用次数
// 行为扩展的执行入口必须是run
public function run(&$content){
if(C('SHOW_RUN_TIME')){
if(false !== strpos($content,'{__NORUNTIME__}')) {
str_replace('{__NORUNTIME__}','',$content);
$runtime = $this-&showTime();
if(strpos($content,'{__RUNTIME__}'))
str_replace('{__RUNTIME__}',$runtime,$content);
str_replace(array('{__NORUNTIME__}','{__RUNTIME__}'),'',$content);
* 显示运行时间、数据库操作、缓存次数、内存使用信息
* @access private
* @return string
private function showTime() {
// 显示运行时间
G('beginTime',$GLOBALS['_beginTime']);
G('viewEndTime');
'Process: '.G('beginTime','viewEndTime').'s ';
if(C('SHOW_ADV_TIME')) {
// 显示详细运行时间
$showTime .= '( Load:'.G('beginTime','loadTime').'s Init:'.G('loadTime','initTime').'s Exec:'.G('initTime','viewStartTime').'s Template:'.G('viewStartTime','viewEndTime').'s )';
if(C('SHOW_DB_TIMES') && class_exists('Db',false) ) {
// 显示数据库操作次数
$showTime .= ' | DB :'.N('db_query').' queries '.N('db_write').' writes ';
if(C('SHOW_CACHE_TIMES') && class_exists('Cache',false)) {
// 显示缓存读写次数
$showTime .= ' | Cache :'.N('cache_read').' gets '.N('cache_write').' writes ';
if(MEMORY_LIMIT_ON && C('SHOW_USE_MEM')) {
// 显示内存开销
$showTime .= ' | UseMem:'. number_format((memory_get_usage() - $GLOBALS['_startUseMems'])/1024).' kb';
if(C('SHOW_LOAD_FILE')) {
$showTime .= ' | LoadFile:'.count(get_included_files());
if(C('SHOW_FUN_TIMES')) {
get_defined_functions();
$showTime .= ' | CallFun:'.count($fun['user']).','.count($fun['internal']);
return $showT
\ No newline at end of file
Index: Lib/Core/Db.class.php
===================================================================
--- Lib/Core/Db.class.php (revision 0)
+++ Lib/Core/Db.class.php (revision 2)
@@ -0,0 +1,922 @@
+// +----------------------------------------------------------------------
+// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
+// +----------------------------------------------------------------------
+// | Copyright (c)
http://thinkphp.cn All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+// +----------------------------------------------------------------------
+// | Author: liu21st &&
+// +----------------------------------------------------------------------
+ * ThinkPHP 数据库中间层实现类
+ * @category
+ * @package
+ * @subpackage
+ * @author
liu21st &&
+class Db {
// 数据库类型
protected $dbType
// 是否自动释放查询结果
protected $autoFree
// 当前操作所属的模型名
protected $model
= '_think_';
// 是否使用永久连接
protected $pconnect
// 当前SQL指令
protected $queryStr
= '';
protected $modelSql
= array();
// 最后插入ID
protected $lastInsID
// 返回或者影响记录数
protected $numRows
// 返回字段数
protected $numCols
// 事务指令数
protected $transTimes = 0;
// 错误信息
protected $error
= '';
// 数据库连接ID 支持多个连接
protected $linkID
= array();
// 当前连接ID
protected $_linkID
// 当前查询ID
protected $queryID
// 是否已经连接数据库
protected $connected
// 数据库连接参数配置
protected $config
= '';
// 数据库表达式
protected $comparison = array('eq'=&'=','neq'=&'&&','gt'=&'&','egt'=&'&=','lt'=&'&','elt'=&'&=','notlike'=&'NOT LIKE','like'=&'LIKE','in'=&'IN','notin'=&'NOT IN');
// 查询表达式
protected $selectSql
= 'SELECT%DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%%ORDER%%LIMIT% %UNION%%COMMENT%';
// 参数绑定
protected $bind
= array();
* 取得数据库类实例
* @access public
* @return mixed 返回数据库驱动类
public static function getInstance() {
$args = func_get_args();
return get_instance_of(__CLASS__,'factory',$args);
* 加载数据库 支持配置文件或者 DSN
* @access public
* @param mixed $db_config 数据库配置信息
* @return string
public function factory($db_config='') {
// 读取数据库配置
$db_config = $this-&parseConfig($db_config);
if(empty($db_config['dbms']))
throw_exception(L('_NO_DB_CONFIG_'));
// 数据库类型
$this-&dbType = ucwords(strtolower($db_config['dbms']));
$class = 'Db'. $this-&dbT
// 检查驱动类
if(class_exists($class)) {
$db = new $class($db_config);
// 获取当前的数据库类型
if( 'pdo' != strtolower($db_config['dbms']) )
$db-&dbType = strtoupper($this-&dbType);
$db-&dbType = $this-&_getDsnType($db_config['dsn']);
// 类没有定义
throw_exception(L('_NO_DB_DRIVER_').': ' . $class);
* 根据DSN获取数据库类型 返回大写
* @access protected
* @param string $dsn
* @return string
protected function _getDsnType($dsn) {
explode(':',$dsn);
$dbType = strtoupper(trim($match[0]));
return $dbT
* 分析数据库配置信息,支持数组和DSN
* @access private
* @param mixed $db_config 数据库配置信息
* @return string
private function parseConfig($db_config='') {
if ( !empty($db_config) && is_string($db_config)) {
// 如果DSN字符串则进行解析
$db_config = $this-&parseDSN($db_config);
}elseif(is_array($db_config)) { // 数组配置
$db_config =
array_change_key_case($db_config);
$db_config = array(
'dbms'
$db_config['db_type'],
'username'
$db_config['db_user'],
'password'
$db_config['db_pwd'],
'hostname'
$db_config['db_host'],
'hostport'
$db_config['db_port'],
'database'
$db_config['db_name'],
'dsn'
$db_config['db_dsn'],
'params'
$db_config['db_params'],
}elseif(empty($db_config)) {
// 如果配置为空,读取配置文件设置
if( C('DB_DSN') && 'pdo' != strtolower(C('DB_TYPE')) ) { // 如果设置了DB_DSN 则优先
$db_config =
$this-&parseDSN(C('DB_DSN'));
$db_config = array (
'dbms'
C('DB_TYPE'),
'username'
C('DB_USER'),
'password'
C('DB_PWD'),
'hostname'
C('DB_HOST'),
'hostport'
C('DB_PORT'),
'database'
C('DB_NAME'),
'dsn'
C('DB_DSN'),
'params'
C('DB_PARAMS'),
return $db_
* 初始化数据库连接
* @access protected
* @param boolean $master 主服务器
* @return void
protected function initConnect($master=true) {
if(1 == C('DB_DEPLOY_TYPE'))
// 采用分布式数据库
$this-&_linkID = $this-&multiConnect($master);
// 默认单数据库
if ( !$this-&connected ) $this-&_linkID = $this-&connect();
* 连接分布式服务器
* @access protected
* @param boolean $master 主服务器
* @return void
protected function multiConnect($master=false) {
static $_config = array();
if(empty($_config)) {
// 缓存分布式数据库配置解析
foreach ($this-&config as $key=&$val){
$_config[$key]
explode(',',$val);
// 数据库读写是否分离
if(C('DB_RW_SEPARATE')){
// 主从式采用读写分离
if($master)
// 主服务器写入
floor(mt_rand(0,C('DB_MASTER_NUM')-1));
if(is_numeric(C('DB_SLAVE_NO'))) {// 指定服务器读
$r = C('DB_SLAVE_NO');
// 读操作连接从服务器
$r = floor(mt_rand(C('DB_MASTER_NUM'),count($_config['hostname'])-1));
// 每次随机连接的数据库
// 读写操作不区分服务器
$r = floor(mt_rand(0,count($_config['hostname'])-1));
// 每次随机连接的数据库
$db_config = array(
'username'
isset($_config['username'][$r])?$_config['username'][$r]:$_config['username'][0],
'password'
isset($_config['password'][$r])?$_config['password'][$r]:$_config['password'][0],
'hostname'
isset($_config['hostname'][$r])?$_config['hostname'][$r]:$_config['hostname'][0],
'hostport'
isset($_config['hostport'][$r])?$_config['hostport'][$r]:$_config['hostport'][0],
'database'
isset($_config['database'][$r])?$_config['database'][$r]:$_config['database'][0],
'dsn'
isset($_config['dsn'][$r])?$_config['dsn'][$r]:$_config['dsn'][0],
'params'
isset($_config['params'][$r])?$_config['params'][$r]:$_config['params'][0],
return $this-&connect($db_config,$r);
* 格式: mysql://username:passwd@localhost:3306/DbName
* @access public
* @param string $dsnStr
* @return array
public function parseDSN($dsnStr) {
if( empty($dsnStr) ){}
$info = parse_url($dsnStr);
if($info['scheme']){
$dsn = array(
'dbms'
$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) : ''
preg_match('/^(.*?)\:\/\/(.*?)\:(.*?)\@(.*?)\:([0-9]{1, 6})\/(.*?)$/',trim($dsnStr),$matches);
$dsn = array (
'dbms'
$matches[1],
'username'
$matches[2],
'password'
$matches[3],
'hostname'
$matches[4],
'hostport'
$matches[5],
'database'
$matches[6]
$dsn['dsn'] =
''; // 兼容配置信息数组
* 数据库调试 记录当前SQL
* @access protected
protected function debug() {
$this-&modelSql[$this-&model]
$this-&queryS
$this-&model
'_think_';
// 记录操作结束时间
if (C('DB_SQL_LOG')) {
G('queryEndTime');
trace($this-&queryStr.' [ RunTime:'.G('queryStartTime','queryEndTime',6).'s ]','','SQL');
* 设置锁机制
* @access protected
* @return string
protected function parseLock($lock=false) {
if(!$lock) return '';
if('ORACLE' == $this-&dbType) {
return ' FOR UPDATE NOWAIT ';
return ' FOR UPDATE ';
* @access protected
* @param array $data
* @return string
protected function parseSet($data) {
foreach ($data as $key=&$val){
if(is_array($val) && 'exp' == $val[0]){
$this-&parseKey($key).'='.$val[1];
}elseif(is_scalar($val) || is_null(($val))) { // 过滤非标量数据
if(C('DB_BIND_PARAM') && 0 !== strpos($val,':')){
md5($key);
$this-&parseKey($key).'=:'.$
$this-&bindParam($name,$val);
$this-&parseKey($key).'='.$this-&parseValue($val);
return ' SET '.implode(',',$set);
* 参数绑定
* @access protected
* @param string $name 绑定参数名
* @param mixed $value 绑定值
* @return void
protected function bindParam($name,$value){
$this-&bind[':'.$name]
* 参数绑定分析
* @access protected
* @param array $bind
* @return array
protected function parseBind($bind){
array_merge($this-&bind,$bind);
$this-&bind
* 字段名分析
* @access protected
* @param string $key
* @return string
protected function parseKey(&$key) {
* value分析
* @access protected
* @param mixed $value
* @return string
protected function parseValue($value) {
if(is_string($value)) {
'\''.$this-&escapeString($value).'\'';
}elseif(isset($value[0]) && is_string($value[0]) && strtolower($value[0]) == 'exp'){
$this-&escapeString($value[1]);
}elseif(is_array($value)) {
array_map(array($this, 'parseValue'),$value);
}elseif(is_bool($value)){
$value ? '1' : '0';
}elseif(is_null($value)){
'null';
* field分析
* @access protected
* @param mixed $fields
* @return string
protected function parseField($fields) {
if(is_string($fields) && strpos($fields,',')) {
= explode(',',$fields);
if(is_array($fields)) {
// 完善数组方式传字段名的支持
// 支持 'field1'=&'field2' 这样的字段别名定义
foreach ($fields as $key=&$field){
if(!is_numeric($key))
$array[] =
$this-&parseKey($key).' AS '.$this-&parseKey($field);
$array[] =
$this-&parseKey($field);
$fieldsStr = implode(',', $array);
}elseif(is_string($fields) && !empty($fields)) {
$fieldsStr = $this-&parseKey($fields);
$fieldsStr = '*';
//TODO 如果是查询全部字段,并且是join的方式,那么就把要查的表加个别名,以免字段被覆盖
return $fieldsS
* table分析
* @access protected
* @param mixed $table
* @return string
protected function parseTable($tables) {
if(is_array($tables)) {// 支持别名定义
foreach ($tables as $table=&$alias){
if(!is_numeric($table))
$array[] =
$this-&parseKey($table).' '.$this-&parseKey($alias);
$array[] =
$this-&parseKey($table);
}elseif(is_string($tables)){
explode(',',$tables);
array_walk($tables, array(&$this, 'parseKey'));
return implode(',',$tables);
* where分析
* @access protected
* @param mixed $where
* @return string
protected function parseWhere($where) {
$whereStr = '';
if(is_string($where)) {
// 直接使用字符串条件
$whereStr = $
}else{ // 使用数组表达式
= isset($where['_logic'])?strtoupper($where['_logic']):'';
if(in_array($operate,array('AND','OR','XOR'))){
// 定义逻辑运算规则 例如 OR XOR AND NOT
' '.$operate.' ';
unset($where['_logic']);
// 默认进行 AND 运算
' AND ';
foreach ($where as $key=&$val){
$whereStr .= '( ';
if(is_numeric($key)){
= '_complex';
if(0===strpos($key,'_')) {
// 解析特殊条件表达式
.= $this-&parseThinkWhere($key,$val);
// 查询字段的安全过滤
if(!preg_match('/^[A-Z_\|\&\-.a-z0-9\(\)\,]+$/',trim($key))){
throw_exception(L('_EXPRESS_ERROR_').':'.$key);
// 多条件支持
= is_array($val) &&
isset($val['_multi']);
= trim($key);
if(strpos($key,'|')) { // 支持 name|title|nickname 方式定义查询字段
explode('|',$key);
foreach ($array as $m=&$k){
$multi?$val[$m]:$
= '('.$this-&parseWhereItem($this-&parseKey($k),$v).')';
$whereStr .= implode(' OR ',$str);
}elseif(strpos($key,'&')){
explode('&',$key);
foreach ($array as $m=&$k){
$multi?$val[$m]:$
= '('.$this-&parseWhereItem($this-&parseKey($k),$v).')';
$whereStr .= implode(' AND ',$str);
$whereStr .= $this-&parseWhereItem($this-&parseKey($key),$val);
$whereStr .= ' )'.$
$whereStr = substr($whereStr,0,-strlen($operate));
return empty($whereStr)?'':' WHERE '.$whereS
// where子单元分析
protected function parseWhereItem($key,$val) {
$whereStr = '';
if(is_array($val)) {
if(is_string($val[0])) {
if(preg_match('/^(EQ|NEQ|GT|EGT|LT|ELT)$/i',$val[0])) { // 比较运算
$whereStr .= $key.' '.$this-&comparison[strtolower($val[0])].' '.$this-&parseValue($val[1]);
}elseif(preg_match('/^(NOTLIKE|LIKE)$/i',$val[0])){// 模糊查找
if(is_array($val[1])) {
$likeLogic
isset($val[2])?strtoupper($val[2]):'OR';
if(in_array($likeLogic,array('AND','OR','XOR'))){
$this-&comparison[strtolower($val[0])];
foreach ($val[1] as $item){
$like[] = $key.' '.$likeStr.' '.$this-&parseValue($item);
$whereStr .= '('.implode(' '.$likeLogic.' ',$like).')';
$whereStr .= $key.' '.$this-&comparison[strtolower($val[0])].' '.$this-&parseValue($val[1]);
}elseif('exp'==strtolower($val[0])){ // 使用表达式
$whereStr .= ' ('.$key.' '.$val[1].') ';
}elseif(preg_match('/IN/i',$val[0])){ // IN 运算
if(isset($val[2]) && 'exp'==$val[2]) {
$whereStr .= $key.' '.strtoupper($val[0]).' '.$val[1];
if(is_string($val[1])) {
explode(',',$val[1]);
implode(',',$this-&parseValue($val[1]));
$whereStr .= $key.' '.strtoupper($val[0]).' ('.$zone.')';
}elseif(preg_match('/BETWEEN/i',$val[0])){ // BETWEEN运算
$data = is_string($val[1])? explode(',',$val[1]):$val[1];
$whereStr .=
' ('.$key.' '.strtoupper($val[0]).' '.$this-&parseValue($data[0]).' AND '.$this-&parseValue($data[1]).' )';
throw_exception(L('_EXPRESS_ERROR_').':'.$val[0]);
$count = count($val);
= isset($val[$count-1])?strtoupper($val[$count-1]):'';
if(in_array($rule,array('AND','OR','XOR'))) {
= $count -1;
= 'AND';
for($i=0;$i&$$i++) {
$data = is_array($val[$i])?$val[$i][1]:$val[$i];
if('exp'==strtolower($val[$i][0])) {
$whereStr .= '('.$key.' '.$data.') '.$rule.' ';
$op = is_array($val[$i])?$this-&comparison[strtolower($val[$i][0])]:'=';
$whereStr .= '('.$key.' '.$op.' '.$this-&parseValue($data).') '.$rule.' ';
$whereStr = substr($whereStr,0,-4);
//对字符串类型字段采用模糊匹配
if(C('DB_LIKE_FIELDS') && preg_match('/('.C('DB_LIKE_FIELDS').')/i',$key)) {
'%'.$val.'%';
$whereStr .= $key.' LIKE '.$this-&parseValue($val);
$whereStr .= $key.' = '.$this-&parseValue($val);
return $whereS
* 特殊条件分析
* @access protected
* @param string $key
* @param mixed $val
* @return string
protected function parseThinkWhere($key,$val) {
= '';
switch($key) {
case '_string':
// 字符串模式查询条件
$whereStr = $
case '_complex':
// 复合查询条件
is_string($val)? $val : substr($this-&parseWhere($val),6);
case '_query':
// 字符串模式查询条件
parse_str($val,$where);
if(isset($where['_logic'])) {
' '.strtoupper($where['_logic']).' ';
unset($where['_logic']);
' AND ';
foreach ($where as $field=&$data)
$array[] = $this-&parseKey($field).' = '.$this-&parseValue($data);
= implode($op,$array);
return $whereS
* limit分析
* @access protected
* @param mixed $lmit
* @return string
protected function parseLimit($limit) {
return !empty($limit)?
' LIMIT '.$limit.' ':'';
* join分析
* @access protected
* @param mixed $join
* @return string
protected function parseJoin($join) {
$joinStr = '';
if(!empty($join)) {
if(is_array($join)) {
foreach ($join as $key=&$_join){
if(false !== stripos($_join,'JOIN'))
$joinStr .= ' '.$_
$joinStr .= ' LEFT JOIN ' .$_
$joinStr .= ' LEFT JOIN ' .$
//将__TABLE_NAME__这样的字符串替换成正规的表名,并且带上前缀和后缀
$joinStr = preg_replace(&/__([A-Z_-]+)__/esU&,C(&DB_PREFIX&).&.strtolower('$1')&,$joinStr);
return $joinS
* order分析
* @access protected
* @param mixed $order
* @return string
protected function parseOrder($order) {
if(is_array($order)) {
foreach ($order as $key=&$val){
if(is_numeric($key)) {
$array[] =
$this-&parseKey($val);
$array[] =
$this-&parseKey($key).' '.$
implode(',',$array);
return !empty($order)?
' ORDER BY '.$order:'';
* group分析
* @access protected
* @param mixed $group
* @return string
protected function parseGroup($group) {
return !empty($group)? ' GROUP BY '.$group:'';
* having分析
* @access protected
* @param string $having
* @return string
protected function parseHaving($having) {
!empty($having)?
' HAVING '.$having:'';
* comment分析
* @access protected
* @param string $comment
* @return string
protected function parseComment($comment) {
!empty($comment)?
' /* '.$comment.' */':'';
* distinct分析
* @access protected
* @param mixed $distinct
* @return string
protected function parseDistinct($distinct) {
return !empty($distinct)?
' DISTINCT ' :'';
* union分析
* @access protected
* @param mixed $union
* @return string
protected function parseUnion($union) {
if(empty($union)) return '';
if(isset($union['_all'])) {
'UNION ALL ';
unset($union['_all']);
'UNION ';
foreach ($union as $u){
$sql[] = $str.(is_array($u)?$this-&buildSelectSql($u):$u);
return implode(' ',$sql);
* 插入记录
* @access public
* @param mixed $data 数据
* @param array $options 参数表达式
* @param boolean $replace 是否replace
* @return false | integer
public function insert($data,$options=array(),$replace=false) {
= array();
$this-&model
$options['model'];
foreach ($data as $key=&$val){
if(is_array($val) && 'exp' == $val[0]){
$this-&parseKey($key);
}elseif(is_scalar($val) || is_null(($val))) { // 过滤非标量数据
$this-&parseKey($key);
if(C('DB_BIND_PARAM') && 0 !== strpos($val,':')){
md5($key);
':'.$
$this-&bindParam($name,$val);
$this-&parseValue($val);
($replace?'REPLACE':'INSERT').' INTO '.$this-&parseTable($options['table']).' ('.implode(',', $fields).') VALUES ('.implode(',', $values).')';
.= $this-&parseLock(isset($options['lock'])?$options['lock']:false);
.= $this-&parseComment(!empty($options['comment'])?$options['comment']:'');
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
* 通过Select方式插入记录
* @access public
* @param string $fields 要插入的数据表字段名
* @param string $table 要插入的数据表名
* @param array $option
查询数据参数
* @return false | integer
public function selectInsert($fields,$table,$options=array()) {
$this-&model
$options['model'];
if(is_string($fields))
= explode(',',$fields);
array_walk($fields, array($this, 'parseKey'));
'INSERT INTO '.$this-&parseTable($table).' ('.implode(',', $fields).') ';
.= $this-&buildSelectSql($options);
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
* 更新记录
* @access public
* @param mixed $data 数据
* @param array $options 表达式
* @return false | integer
public function update($data,$options) {
$this-&model
$options['model'];
= 'UPDATE '
.$this-&parseTable($options['table'])
.$this-&parseSet($data)
.$this-&parseWhere(!empty($options['where'])?$options['where']:'')
.$this-&parseOrder(!empty($options['order'])?$options['order']:'')
.$this-&parseLimit(!empty($options['limit'])?$options['limit']:'')
.$this-&parseLock(isset($options['lock'])?$options['lock']:false)
.$this-&parseComment(!empty($options['comment'])?$options['comment']:'');
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
* 删除记录
* @access public
* @param array $options 表达式
* @return false | integer
public function delete($options=array()) {
$this-&model
$options['model'];
= 'DELETE FROM '
.$this-&parseTable($options['table'])
.$this-&parseWhere(!empty($options['where'])?$options['where']:'')
.$this-&parseOrder(!empty($options['order'])?$options['order']:'')
.$this-&parseLimit(!empty($options['limit'])?$options['limit']:'')
.$this-&parseLock(isset($options['lock'])?$options['lock']:false)
.$this-&parseComment(!empty($options['comment'])?$options['comment']:'');
return $this-&execute($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
* 查找记录
* @access public
* @param array $options 表达式
* @return mixed
public function select($options=array()) {
$this-&model
$options['model'];
= $this-&buildSelectSql($options);
isset($options['cache'])?$options['cache']:
if($cache) { // 查询缓存检测
is_string($cache['key'])?$cache['key']:md5($sql);
S($key,'',$cache);
if(false !== $value) {
= $this-&query($sql,$this-&parseBind(!empty($options['bind'])?$options['bind']:array()));
if($cache && false !== $result ) { // 查询缓存写入
S($key,$result,$cache);
* 生成查询SQL
* @access public
* @param array $options 表达式
* @return string
public function buildSelectSql($options=array()) {
if(isset($options['page'])) {
// 根据页数计算limit
if(strpos($options['page'],',')) {
list($page,$listRows) =
explode(',',$options['page']);
$page = $options['page'];
$page?$page:1;
$listRows=
isset($listRows)?$listRows:(is_numeric($options['limit'])?$options['limit']:2

我要回帖

更多关于 E.P.N.S 的文章

 

随机推荐