You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Cache::remember缓存键路径错误问题求助

解决Laravel文件缓存生成带斜杠路径的问题

Laravel的文件缓存驱动默认会把哈希后的缓存键拆成两级子目录(取哈希值前两位和接下来两位作为目录),用来优化大量缓存文件时的读取性能。但如果你的场景不需要这种结构,就会出现子目录不存在的报错,以下是两种解决办法:

方法一:自定义平级目录的文件缓存驱动

创建一个继承自默认FileStore的自定义存储类,重写路径生成逻辑,直接使用完整哈希值作为文件名:

<?php

namespace App\Cache;

use Illuminate\Cache\FileStore;
use Illuminate\Contracts\Filesystem\Filesystem;

class FlatFileStore extends FileStore
{
    public function path($key)
    {
        $hash = $this->hash($key);
        // 直接返回完整哈希文件名,不拆分目录
        return $this->directory.'/'.$hash;
    }
}

接着在App\Providers\AppServiceProvider的boot方法里注册这个自定义驱动:

use App\Cache\FlatFileStore;
use Illuminate\Support\Facades\Cache;
use Illuminate\Filesystem\Filesystem as IlluminateFilesystem;

public function boot()
{
    Cache::extend('flatfile', function ($app) {
        $path = $app['config']['cache.stores.file.path'];
        return Cache::repository(new FlatFileStore(new IlluminateFilesystem, $path));
    });
}

最后修改config/cache.php,把默认缓存驱动改成flatfile,或者在使用缓存时指定驱动:

Cache::store('flatfile')->remember("comment-".$comment->id."-project", 60, function () use ($filter) {
    return $filter->organization->id;
});

方法二:手动生成无拆分的缓存键

自己对缓存键做哈希处理,直接用哈希值作为缓存键传入,这样驱动就不会自动拆分目录:

$cacheKey = "comment-".$comment->id."-project";
// 用MD5或SHA256生成哈希键,确保唯一性
$hashedKey = md5($cacheKey);
Cache::remember($hashedKey, 60, function () use ($filter) {
    return $filter->organization->id;
});

注意:这种方式如果缓存文件数量过多,可能会导致单目录下文件拥挤,影响读写性能,适合缓存量不大的场景。

内容的提问来源于stack exchange,提问作者JonatanRek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:09:24