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

Laravel任务调度:如何每6小时存数据库数据供页面数组调用

Laravel定时采集数据并供多页面调用的解决方案

你的核心问题是调度任务只执行了数据库查询,但没有把数据存储到全局可访问的位置,导致页面无法获取。最适合的方案是将查询结果存入缓存,因为缓存可以在整个应用中被控制器、视图直接调用,且能完美匹配你每6小时更新的需求。

1. 修改调度任务,将数据存入缓存

调整app/Console/Kernel.php中的调度逻辑,查询数据后存入缓存,并设置合理的过期时间:

protected function schedule(Schedule $schedule)
{
    $schedule->call(function(){
        // 执行数据库查询
        $dataGlobal = DB::select("select * from articles order by articleDate ASC");
        // 将数据存入缓存,设置6小时10分钟过期(避免调度延迟导致缓存空档)
        Cache::put('global_articles', $dataGlobal, now()->addHours(6)->addMinutes(10));
    })->cron('0 */6 * * *'); // 改为每6小时整点执行,避免不必要的频繁执行
}

2. 在页面/控制器中获取缓存数据

在需要使用数据的控制器或视图中,直接从缓存读取数据,同时添加兜底逻辑(缓存未命中时直接查询数据库):

控制器中使用

public function yourPageMethod()
{
    // 优先从缓存取数据,缓存不存在则实时查询
    $dataGlobal = Cache::get('global_articles', function(){
        return DB::select("select * from articles order by articleDate ASC");
    });
    
    return view('your-page-view', compact('dataGlobal'));
}

视图中直接使用

<?php 
// 视图内直接获取缓存数据,同样带兜底逻辑
$dataGlobal = Cache::get('global_articles', function(){
    return DB::select("select * from articles order by articleDate ASC");
}); 
?>

3. 确保调度器正常运行

本地开发时,你可以手动执行php artisan schedule:run来触发调度任务;部署到服务器后,必须配置系统cron定时任务来自动触发Laravel调度:

* * * * * cd /你的项目根目录路径 && php artisan schedule:run >> /dev/null 2>&1

这个cron任务会每分钟检查一次Laravel的调度列表,到指定时间自动执行你的数据采集任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:24:20