Thinkphp6.0.12分页+缓存导致致命错误
版本号: 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]
检测下你自定义key是否已经存在缓存数据了
刚开始我也怀疑可能是自定义key被占用了, 检查发现后是没有这种情况的. 只要把paginate()换成select(), 就一切正常了. 所以我猜问题可能就在paginate()
突然想到一个情况, 自定义key的情况下, 每一页的内容都不同, 但是key是相同的, 可能会被因此覆盖掉.或者paginate()的机制可能还是当成未自定义key的情况来处理.那么带分页的自定义key的缓存该如何处理呢?
自己拼接key名称, 比如:
cache('page-cache-'.$page);
嗯, 这应该是一个好办法, 但是Db查询中, 自定义key的cache()和paginate()同时使用仍然是有BUG的, 我刚才又测试了一下. 缓存中的数据只有一个数字2, 并不是像使用select()查询出来的序列化后的数据.
先清空下缓存再试试
嗯, 试过了 比如这个
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