EasyWeChat 默认使用 Symfony 文件缓存而非框架 Redis 配置,导致命令行环境因缓存隔离报错;需手动将 Laravel Redis 缓存实例注入 EasyWeChat 并设置命名空间与有效期。

EasyWeChat 默认不走框架的缓存配置,哪怕你 Laravel 或 ThinkPHP 里已配好 Redis,它照样用自己的一套——文件缓存,路径在系统临时目录(比如 /tmp/symfony-cache),这就容易导致 HTTP 请求能跑通、命令行(console)却报 Credential "component_verify_ticket" does not exist in cache 这类错。
缓存驱动不一致是核心问题
EasyWeChat 底层用的是 symfony/cache,默认适配器是 FilesystemAdapter,和 Laravel 的 cache.store('redis') 完全隔离。即使你在配置里写了 use_laravel_cache => true,这个选项在新版 EasyWeChat 中基本失效,尤其在手动传配置(如 Factory::miniProgram([...]))时,根本不会自动桥接 Laravel 缓存实例。
- HTTP 请求能缓存成功,是因为 Web 服务器进程共享了同一份文件缓存(或同一 Redis 实例)
- Console 命令是独立 PHP 进程,若未显式指定缓存适配器,就可能读不到 HTTP 进程写入的缓存,尤其是文件缓存权限、路径不一致时
- Redis 缓存查不到
easywechat.kernel.access_token.*键,说明 EasyWeChat 根本没往你配的 Redis 里写
强制统一用 Redis 缓存(推荐)
绕过默认文件缓存,直接把 EasyWeChat 的缓存底层替换成 Laravel 已配置好的 Redis 实例,一劳永逸:
- 获取 Laravel 的 Redis 缓存处理器:
Cache::store('redis')->handler() - 用它创建
Symfony\Contracts\Cache\CacheInterface兼容的适配器,例如RedisAdapter - 调用
$app->rebind('cache', $cache)替换内置缓存服务
示例代码(Laravel 环境):
立即学习“PHP免费学习笔记(深入)”;
$app = Factory::officialAccount(config('wechat.official_account'));
$cache = new RedisAdapter(Cache::store('redis')->handler());
$app->rebind('cache', $cache);
其他实用配置项别漏掉
光换缓存驱动还不够,配合以下设置更稳妥:
-
$app->setCacheLifetime(7200):显式设缓存有效期(秒),避免依赖默认值 -
$app->setCacheNamespace('myapp_wechat'):加命名空间,防止多项目共用 Redis 时键名冲突 - 确保
php.ini中session.save_path和sys_temp_dir可写(仅当仍需回退到文件缓存时)
命令行环境要额外注意
Console 场景下容易踩的坑:
- CLI 的 PHP 配置可能和 Web 不同(比如 OPcache 开关、临时目录权限),建议用
php -i | grep 'sys_temp_dir\|session.save_path'核对 - 不要依赖
.env中的缓存配置自动加载——console 启动时环境变量可能未完全加载,推荐显式传参或初始化 - 如果用队列任务调用微信接口,务必在每个任务中重新绑定缓存实例,不能复用全局
$app



















