framework icon indicating copy to clipboard operation
framework copied to clipboard

Thinkphp6.0.12分页+缓存导致致命错误

Open zjkal opened this issue 3 years ago • 7 comments

版本号: Thinkphp6.0.12 废话不说, 直接上代码

Db::name('project_comment')->json(['img'])->where('pid', '=', $project_id)->order('id', 'desc')->cacheAlways('test_key',Time::secondDay())->paginate(['list_rows' => 15, 'query' => request()->param()])

这个代码里, 同时使用了paginate和cache以后, 只要自定义cache的key, 就会报错.如果不自定义key就是正常的. 错误如下: #0 [0]TypeError in PDOConnection.php line 695 think\db\PDOConnection::pdoQuery(): Return value must be of type array, string returned

   if ($query->getOptions('cache')) {
            // 检查查询缓存
            $cacheItem = $this->parseCache($query, $query->getOptions('cache'));
            $key       = $cacheItem->getKey();
            $data = $this->cache->get($key);
            if (null !== $data) {
                return $data;
            }
        }
        if ($sql instanceof Closure) {
            $sql  = $sql($query);
            $bind = $query->getBind();
        }
        if (!isset($master)) {

致命错误,静待更新. 需要了解其他情况, 请随时联系我. QQ:252333696 Email:[email protected]

zjkal avatar May 09 '22 08:05 zjkal

检测下你自定义key是否已经存在缓存数据了

liu21st avatar May 10 '22 03:05 liu21st

刚开始我也怀疑可能是自定义key被占用了, 检查发现后是没有这种情况的. 只要把paginate()换成select(), 就一切正常了. 所以我猜问题可能就在paginate()

zjkal avatar May 10 '22 06:05 zjkal

突然想到一个情况, 自定义key的情况下, 每一页的内容都不同, 但是key是相同的, 可能会被因此覆盖掉.或者paginate()的机制可能还是当成未自定义key的情况来处理.那么带分页的自定义key的缓存该如何处理呢?

zjkal avatar May 11 '22 02:05 zjkal

自己拼接key名称, 比如:

cache('page-cache-'.$page);

augushong avatar May 11 '22 02:05 augushong

嗯, 这应该是一个好办法, 但是Db查询中, 自定义key的cache()和paginate()同时使用仍然是有BUG的, 我刚才又测试了一下. 缓存中的数据只有一个数字2, 并不是像使用select()查询出来的序列化后的数据.

zjkal avatar May 11 '22 02:05 zjkal

先清空下缓存再试试

augushong avatar May 11 '22 03:05 augushong

嗯, 试过了 比如这个

Db::name('project_comment')->json(['img'])->where('pid', '=', $project_id)->order('id', 'desc')->cache('comments_pid' . $project_id . '_page' . input('page', 1), 3600)->paginate(['list_rows' => 15, 'query' => request()->param()]);

缓存中键为comments_pid1_page1的值是28

zjkal avatar May 11 '22 03:05 zjkal