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

Laravel Jetstream 4.1中Agent.php的MobileDetect/PSR缓存功能异常

Laravel Jetstream 4.1 Agent.php缓存set/get异常:存储值正确但返回1

问题概述

在Laravel Jetstream 4.1的Agent.php中使用MobileDetect时,缓存的set/get功能出现异常。修改retrieveUsingCacheOrResolve函数添加调试代码后发现:调用$this->cache->set时传入了正确的字符串值(如Windows、Edge),但后续调用$this->cache->get返回的结果始终是1。

调试代码

return tap(call_user_func($callback), function ($value) use ($cacheKey, $key) {
    $result = $this->cache->set($cacheKey, $value);
    error_log("Cache set for {$key}: {$value} => " . ($result ? 'true' : 'false'));
    $cacheItem = $this->cache->get($cacheKey);
    error_log("Key: {$key}, cacheItem: " . print_r($cacheItem, true));
    $value = $cacheItem->get();
    error_log("Cache get for {$key}: {$value}");
});

环境信息

  • PHP v8.2.12
  • laravel/framework v10.33.0
  • laravel/fortify v1.18.1
  • laravel/jetstream v4.1.0
  • livewire/livewire v3.2.1
  • psr/simple-cache v3.0.0

问题原因及解决方案

1. 调试代码中的API混淆

Jetstream的Agent类依赖PSR-16 SimpleCache规范,$this->cache->get($cacheKey)直接返回存储的原始值(如字符串Windows),而非PSR-6规范中的CacheItem对象。你的调试代码中调用了$cacheItem->get(),属于错误使用API:

  • 若缓存返回的是字符串,调用get()会触发PHP错误;而你得到1的结果,说明实际缓存返回的是布尔值true(被转为1),意味着缓存存储的值并非你预期的字符串。

2. 排查缓存存储异常的步骤

步骤1:确认回调函数的返回值

先验证call_user_func($callback)的返回值是否确实为预期的字符串:

$callbackResult = call_user_func($callback);
error_log("Callback result for {$key}: " . var_export($callbackResult, true));
// 再执行后续缓存逻辑

如果回调返回的是布尔值true(即1),说明问题出在MobileDetect的方法调用上(比如误调用了isWindows()而非getOperatingSystem())。

步骤2:确认缓存实例的规范实现

确保注入Agent类的缓存实例是PSR-16 SimpleCache的实现(Laravel默认的Illuminate\Cache\Repository符合要求)。可以在Agent类的构造函数中添加验证:

public function __construct(?CacheInterface $cache = null)
{
    $this->detect = new MobileDetect;
    $this->cache = $cache;
    
    if ($this->cache) {
        error_log("Cache implementation: " . get_class($this->cache));
        // 验证是否为PSR-16
        if (!$this->cache instanceof \Psr\SimpleCache\CacheInterface) {
            error_log("Invalid cache implementation: expected PSR-16 SimpleCache");
        }
    }
}

如果发现注入的是PSR-6的CacheItemPool实例,需要调整服务绑定,确保注入正确的PSR-16实现。

步骤3:检查缓存驱动配置

  • 确认.env中的缓存驱动配置正确(如CACHE_DRIVER=file或redis),且驱动对应的存储介质(如文件目录、Redis服务)正常可用、权限充足。
  • 对于文件缓存,检查storage/framework/cache/data目录是否可读写;对于Redis,确认连接配置正确且服务运行正常。

步骤4:验证缓存键的唯一性

Jetstream的Agent类通过md5(request()->userAgent())生成缓存键的前缀,若请求的User-Agent在调试过程中发生变化,会导致缓存键不一致,获取到旧的缓存值。可以打印$cacheKey确认:

error_log("Cache key for {$key}: {$cacheKey}");

修复后的示例代码

将调试代码修正为符合PSR-16规范的写法:

return tap(call_user_func($callback), function ($value) use ($cacheKey, $key) {
    $result = $this->cache->set($cacheKey, $value);
    error_log("Cache set for {$key}: {$value} => " . ($result ? 'true' : 'false'));
    $cachedValue = $this->cache->get($cacheKey);
    error_log("Cache get for {$key}: " . var_export($cachedValue, true));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:54:56