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
相关产品推荐
相关产品推荐

