Laravel 10运行Vite开发服务器后出现无法创建可锁定文件错误
问题回顾
启动npm run dev后,Web应用API调用报错:
Unable to create lockable file: C:\Websites\website.nl\storage\framework/cache/data/03/bc/03bc23b61d4cf128f2bd79541d52e1b98f18c79d. Please ensure you have permission to create files in this location.
同时执行php artisan cache:clear也会报错:
ERROR Failed to clear cache. Make sure you have the appropriate permissions.
且仅在Vite开发服务器运行时出现问题,热重载刷新页面约1分钟后,缓存文件中的内容会从1变为0。
解决方案
1. 调整Windows原生文件权限
别用WSL的chmod,直接在Windows里操作:
- 找到项目的
storage文件夹,右键选属性 → 切换到安全标签 - 点击编辑,添加当前登录的Windows用户,给该用户分配完全控制权限
- 勾选“将权限应用到所有子文件夹和文件”,点击确定保存
如果用WSL2挂载Windows目录,也可以在WSL里执行:
sudo chown -R $USER:$USER /mnt/c/Websites/website.nl/storage
确保WSL用户对挂载目录有读写权限。
2. 切换Laravel缓存驱动(快速规避)
开发环境可以临时改用非文件类缓存驱动,绕开文件权限冲突:
打开项目根目录的.env文件,修改缓存驱动配置:
CACHE_DRIVER=array
array驱动是内存缓存,重启服务器后缓存会清空,适合开发阶段使用。如果本地装了Redis,也可以改成CACHE_DRIVER=redis。
3. 调整文件缓存的锁超时设置
问题大概率是Vite热重载进程和Laravel的PHP进程对缓存文件的锁竞争导致的,调整锁超时时间:
打开config/cache.php,找到file驱动的配置项,修改锁超时:
'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), 'lock_timeout' => 60, // 延长锁超时到60秒,默认10秒 ],
如果还是不行,可以直接禁用锁:
'file' => [ 'driver' => 'file', 'path' => storage_path('framework/cache/data'), 'lock_timeout' => 0, // 禁用文件锁 ],
修改后执行php artisan config:clear生效。
4. 用Windows命令批量重置权限
打开管理员命令提示符,进入项目根目录,执行:
icacls storage /grant Everyone:F /T
这个命令会给storage文件夹及所有子文件/文件夹添加Everyone的完全控制权限,快速排查权限问题。
内容的提问来源于stack exchange,提问作者Floris

