【原创】ThinkPHP5.0.7缓存空数组的BUG

作者Veris 文章分类 分类:PHP 文章评论 0条评论 阅读次数 已被围观 647
问题:在对数据库查询获取到“空数据”时,不会写入缓存。
我使用的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判断

分类:PHP

发表评论: