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判断

分类:
已被围观 
发表评论: