手机端和pc端显示不同数据,八成是缓存键未区分设备类型导致冲突;需在key中加入device标识(如'article_list_mobile_v2'),并通过中间件统一注入设备维度,最后清理混用缓存。

手机端和PC端访问同一页面却显示不同数据,八成是缓存键没区分设备类型,导致手机用户读到了PC端写入的旧缓存,或反之;这不是缓存失效,而是缓存键冲突。
确认缓存是否真被复用
在控制器中加一行调试代码:dump(Cache::get('article_list_v1'));,分别用手机和PC访问,看输出的值是否一致。如果一致,说明缓存键完全相同,问题就出在key生成逻辑上。
检查你调用cache()时是否传了固定字符串key——比如->cache('article_list', 3600),这种写法会让所有设备共用同一个key,必须改。
为不同设备生成独立缓存键
方法一:在key中拼入设备标识
获取设备类型:$device = request()->isMobile() ? 'mobile' : 'pc';
构造带区分的key:$key = 'article_list_' . $device . '_v2';
然后写入:UserModel::where('status', 1)->cache($key, 1800)->select();
【注意:v2这类版本号必须随逻辑变更手动升级,否则改了代码但key不变,缓存还是旧的】
方法二:用URL参数自动识别(适合已带device=mobile的请求)
提取参数:$device = input('device', 'pc');
组合key:$key = 'article_list_' . $device . '_' . md5(input('url'));
这一步能避免因路由参数顺序不同导致key不一致,但md5会增加CPU开销,仅在URL复杂时用。
统一入口强制注入设备维度
第一步:在app/middleware/DeviceMiddleware.php中添加中间件
写入:public function handle($request, \Closure $next) { $request->device = $request->isMobile() ? 'mobile' : 'pc'; return $next($request); }
第二步:在app/middleware.php中注册该中间件到全局
第三步:在模型查询前统一取设备类型:$device = request()->device; Cache::remember("user_home_{$device}", 300, function () use ($device) { return UserModel::where('device', $device)->select(); });
这一步确保所有缓存key都带device上下文,不再依赖各控制器零散判断。
清理已有混用缓存
执行命令:php think cache:clear --type=file 清空文件缓存
如果用了Redis,运行:php think cache:clear --type=redis
【线上环境务必先备份当前缓存:redis-cli --scan --pattern "article_list_*" | xargs -L 100 redis-cli MGET > backup.txt】
删完后立刻用手机和PC各访问一次,观察新缓存是否各自独立生成。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











