早段时间前端同学说申请订单时,提交订单金额是0.1元,可是查看后端入库后信息为0元。
我第一个反应就是数据字段类型问题。可能金额设置成了整形。看下字段果然是,改回了float,本地测试下没问题提交到外服。可在外服 发现没有生效。可能是 nginx+php-fpm 缓存问题?于是我重启了 nginx+mysql+php,发现问题并没有解决。
这时我就奇怪了,难道说我的代码没有更新上去?我在入库逻辑部分添加打印信息,提交到外服,跟踪下入库情况,发现我的逻辑并没有问题, 外服数据库字段类型也改好了。这时我就纳闷了,我知道跟到thinkphp底层可能会找出问题,但是我没有这样做(因为我不喜欢thinkphp,根本 不想去深究它,是公司所逼才会用上thinkphp的,哈哈)。
我把外服改成 DEBUG 模式,测试下,发现数据正常入库没问题了。到这里我可以确定是thinkphp DEBUG 模式问题导致的。于是翻看下 thinkphp 官方
文档,在 调试->调试模式
一节中写到:
关闭字段缓存,数据表字段修改不受缓存影响
言外之意就是说,如果是非 DEBUG 模式,那么数据字段将会被缓存,数据表字段修改后将无法生效。于是我继续跟踪有关 字段缓存
的文档说明。
在 模型->字段定义
一节中写到:
文档说 字段缓存保存在 Runtime/Data/_fields/
目录下面,于是我前往查看下,果然,旧的字段类型还在缓存中。我把缓存文件删除,重新测试一遍,
正常没问题了。
干脆牺牲点性能,把缓存字段设置关闭掉,防止后面又遇到这种问题。在 config.php
中 添加一条配置信息
// 关闭字段缓存
'DB_FIELDS_CACHE'=>false
文档看起来很简单,过目后就忘记,等到真正踩到坑后才会记得住原来是这么一回事。