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

如何将Laravel Command中生成的$topics变量读取到Controller中

解决方案

Laravel的调度命令运行进程和HTTP请求的Controller进程相互独立,无法直接读取对方内存中的变量,需要通过共享存储的方式传递数据,最优实现方案如下:

方案1:缓存存储(最优,适合无需留存历史数据的场景)

小体量数据的跨进程传递优先用Laravel自带的缓存组件,实现成本最低、读取性能最高。

改造定时命令代码:

public function handle()
{
    $topics = DB::table("sentences")
        ->select("topic")
        ->orderByRaw("RAND()")
        ->distinct()
        ->limit(5)
        ->get();
    // 写入缓存,有效期设置为1天(和调度任务执行周期对齐即可)
    cache()->put('daily_random_topics', $topics, now()->addDay());
    
    return 0;
}

Controller中读取:

public function yourGetMethod()
{
    // 直接读取缓存,加兜底逻辑避免缓存丢失/定时任务未执行的问题
    $topics = cache()->remember('daily_random_topics', now()->addDay(), function () {
        return DB::table("sentences")
            ->select("topic")
            ->orderByRaw("RAND()")
            ->distinct()
            ->limit(5)
            ->get();
    });

    // 后续业务逻辑
}

方案2:数据表存储(适合需要留存历史每日topic数据的场景)

如果需要追溯历史每日生成的topic,可以新建daily_topics数据表,结构参考:

  • id 主键
  • topics JSON类型 存储当日查询到的5个topic
  • created_at 时间戳

定时命令代码改造:

public function handle()
{
    $topics = DB::table("sentences")
        ->select("topic")
        ->orderByRaw("RAND()")
        ->distinct()
        ->limit(5)
        ->get();
    // 写入数据表
    DB::table('daily_topics')->insert([
        'topics' => $topics,
        'created_at' => now()
    ]);
    
    return 0;
}

Controller中读取:

public function yourGetMethod()
{
    // 取最新的一条记录即可
    $topics = DB::table('daily_topics')
        ->orderBy('created_at', 'desc')
        ->value('topics');

    // 后续业务逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:57:01