Apr
20
2017
【原创】ThinkPHP5.0.7缓存空数组的BUG
问题:在对数据库查询获取到“空数据”时,不会写入缓存。
我使用的TP版本:5.0.7_core
我看了下db\Query.php,在2304行有一句判断
所以我将判断修改为
获取到我们的空数组后if (!$resultSet)为true又一次进行了缓存操作。
我的修改:
我使用的TP版本:5.0.7_core
我看了下db\Query.php,在2304行有一句判断
if (isset($cache) && $resultSet) { // 缓存数据集 $this->cacheData($key, $resultSet, $cache); }在这个判断前$resultSet有一次查询操作,如果返回的是一个空数组,那么这个判断不会成立,也就不会写入缓存(虽然说空数组没有缓存的意义,但这确实是一次原原本本的数据库操作)。
所以我将判断修改为
if (isset($cache) && (FALSE!==$resultSet)) { // 缓存数据集 $this->cacheData($key, $resultSet, $cache); }你以为这就结束了吗,呵呵,读取是没问题了,但写入还是有问题,还是判断问题,请看2283行:
if (empty($options['fetch_sql']) && !empty($options['cache'])) { // 判断查询缓存 $cache = $options['cache']; unset($options['cache']); $key = is_string($cache['key']) ? $cache['key'] : md5(serialize($options)); $resultSet = Cache::get($key); } if (!$resultSet) { //<<<<<<<判断有问题<<<<<<< // 生成查询SQL $sql = $this->builder->select($options); // 获取参数绑定 $bind = $this->getBind(); ……在这句判断上面有个缓存获取操作:$resultSet = Cache::get($key);
获取到我们的空数组后if (!$resultSet)为true又一次进行了缓存操作。
我的修改:
if (FALSE===$resultSet)
至此读写正常。
=======题外话=======
tp中,获取缓存数据成功则返回缓存数据,失败则返回false,注意缓存数据的empty判断
发表评论: