缓存键设计错误导致不同url共用同一缓存项,应使用url哈希生成唯一键:如'page_title_' . md5($url),并确保启用file或redis缓存驱动。

初学者在 Laravel 8 中为远程页面标题提取功能添加缓存时,常因直接使用固定字符串作为缓存键(如 'title_cache'),导致不同 URL 全部写入并读取同一缓存项,最终所有请求返回首个被缓存的标题——这不是缓存失效,而是缓存键设计错误引发的数据污染。
错误示范:硬编码缓存键
直接传入静态字符串,完全忽略 $url 变量:
$html = cache()->remember('title_cache', now()->addHours(24), fn() => file_get_contents($url));
这行代码看似简洁,实则危险。无论 $url 是 https://laravel.com 还是 https://php.net,系统始终查找名为 【title_cache】 的缓存条目。首个请求成功后,后续所有请求都命中该缓存,返回错误标题。
缓存驱动本身无错,错在键名与数据源完全解耦。
正确做法:URL 安全的动态键生成
必须让每个 URL 拥有唯一、可预测、无冲突的缓存键。推荐使用哈希函数处理原始 URL,规避特殊字符(如 / ? # :)引发的缓存驱动异常或截断风险。
方法一:md5 哈希(兼容性最强)
第一步:对原始 URL 取 md5 值,生成 32 字符固定长度字符串
第二步:拼接命名空间前缀,避免与其他缓存键冲突
$cacheKey = 'page_title_' . md5($url);
方法二:标准化后再哈希(防重复缓存)
先移除末尾斜杠、统一协议小写、剥离查询参数(按业务需要),再哈希:
$normalizedUrl = rtrim(parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH), '/');
$cacheKey = 'page_title_' . md5($normalizedUrl);
注意:若需保留查询参数(如 ?id=123),则跳过标准化步骤,直接哈希完整 URL。
关键校验:确认缓存驱动已启用
运行以下代码验证当前缓存是否跨请求生效:
Cache::put('test_key', 'works', 60); var_dump(Cache::get('test_key'));
若返回 null,请检查 .env 中 【CACHE_DRIVER=file 或 redis】,禁用 array 驱动(仅内存有效,无法跨请求)。
开发阶段务必执行 php artisan config:clear 确保配置实时加载。











