2016/06/17

thinkphp字段缓存问题


早段时间前端同学说申请订单时,提交订单金额是0.1元,可是查看后端入库后信息为0元。

我第一个反应就是数据字段类型问题。可能金额设置成了整形。看下字段果然是,改回了float,本地测试下没问题提交到外服。可在外服 发现没有生效。可能是 nginx+php-fpm 缓存问题?于是我重启了 nginx+mysql+php,发现问题并没有解决。

这时我就奇怪了,难道说我的代码没有更新上去?我在入库逻辑部分添加打印信息,提交到外服,跟踪下入库情况,发现我的逻辑并没有问题, 外服数据库字段类型也改好了。这时我就纳闷了,我知道跟到thinkphp底层可能会找出问题,但是我没有这样做(因为我不喜欢thinkphp,根本 不想去深究它,是公司所逼才会用上thinkphp的,哈哈)。

我把外服改成 DEBUG 模式,测试下,发现数据正常入库没问题了。到这里我可以确定是thinkphp DEBUG 模式问题导致的。于是翻看下 thinkphp 官方 文档,在 调试->调试模式 一节中写到:

/blog/img/ziduanhuancun_01.png

关闭字段缓存,数据表字段修改不受缓存影响

言外之意就是说,如果是非 DEBUG 模式,那么数据字段将会被缓存,数据表字段修改后将无法生效。于是我继续跟踪有关 字段缓存 的文档说明。

模型->字段定义 一节中写到:

/blog/img/ziduanhuancun_02.png

/blog/img/ziduanhuancun_03.png

文档说 字段缓存保存在 Runtime/Data/_fields/ 目录下面,于是我前往查看下,果然,旧的字段类型还在缓存中。我把缓存文件删除,重新测试一遍, 正常没问题了。

干脆牺牲点性能,把缓存字段设置关闭掉,防止后面又遇到这种问题。在 config.php 中 添加一条配置信息

// 关闭字段缓存
'DB_FIELDS_CACHE'=>false

文档看起来很简单,过目后就忘记,等到真正踩到坑后才会记得住原来是这么一回事。