Thinkphp 开启字段缓存后,生成字段缓存文件bug修改
遇到问题描述如下:
项目中用到两数据库 ,一个基础数据库,基础数据库hq_gynzsxjy中有个站内信息表 hq_sf_message ; 一个微圈数据库hq_gynzsxjy_sxq(简化微信好友圈功能),微圈数据库有同样有个 消息表hq_sxq_message;
项目为采用了分组,Model目录大致如下
Model
Base
MessageModel.class.php,对应hq_sf_message表
Sxq
MessageModel.class.php对应hq_sxq_message表
项目关闭debug模式,开启数据字段缓存
RuntimeData\_fields下只生成文件hq_gynzsxjy.message.php,未生成hq_qynzsxjy_sxq.message.php文件
两个表结构并不一致的,导致已生成缓存后,另一个信息表的相关操作有误(所取字段不同);
查询tp框架后解决办法:
thinkphp的核心文件Model.class.php中
/** * 自动检测数据表信息 * @access protected * @return void */ protected function _checkTableInfo() { // 如果不是Model类 自动记录数据表信息 // 只在第一次执行记录 if(empty($this->fields)) { // 如果数据表字段没有定义则自动获取 if(C("DB_FIELDS_CACHE")) { $db = $this->dbName?$this->dbName:C("DB_NAME"); $fields = F("_fields/".strtolower($db.".".$this->name)); if($fields) { $version = C("DB_FIELD_VERSION"); if(empty($version) || $fields["_version"]== $version) { $this->fields = $fields; return ; } } } // 每次都会读取数据表信息 $this->flush(); } }
标红的两行有误,正常情况下如果连接多个数据库,只取了C("DB_NAME");如果是多数据库连接增加配置
// 实习圈相关数据库 "DB_SXQ" => array( /* 数据库配置 */ "DB_TYPE" => "mysql", // 数据库类型 "DB_HOST" => $db_host, // 服务器地址 "DB_NAME" => $db_name. "_sxq",// 数据库名 "DB_USER" => $db_user, // 用户名 "DB_PWD" => $db_pass, // 密码 "DB_PREFIX" => "hq_" ),应该取的是C("DB_SXQ.DB_NAME");修改如下:
$connectionStr = $this->connection?$this->connection.".":""; $db = $this->dbName?$this->dbName:C($connectionStr."DB_NAME"); $fields = F("_fields/".strtolower($db.".".$this->name));
修改后生成字段缓存文件
RuntimeData\_fields下生成文件hq_gynzsxjy.message.php 和hq_gynzsxjy_sxq.message.php
如果要求严格的话可以将下面
$fields = F("_fields/".strtolower($db.".".$this->name));
可以改为
$nameStr = $this->tableName?$this->tableName:$this->name;
$fields = F("_fields/".strtolower($db.".".$nameStr));源代码中取的$this->name为model名称,正常应该先取表名,表名未定义再取model名称;
最后生成缓存文件为:数据库名 . 表名
F("_fields 对应的另外一个位置也要修改一下
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: ThinkPHP静态缓存简单配置和使用
- 下一篇: yii2默认路径