最族
【原创】ThinkPHP5.0.7缓存空数组的BUG
2017-4-20 Veris
问题:在对数据库查询获取到“空数据”时,不会写入缓存。

我使用的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判断

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容