Laravel 8 任务调度器
Posted
技术标签:
【中文标题】Laravel 8 任务调度器【英文标题】:Laravel 8 Task scheduler 【发布时间】:2021-10-22 16:33:51 【问题描述】:我正在使用 laravel 调度程序,如果满足某个条件,我想将订阅状态设置为过期,并且还需要它在后台每分钟运行一次。图任务调度程序是最好的选择,但不能找出为什么在运行 php artisan schedule:work 后代码没有执行。下面是我的代码 位于 App/Console/Kernel.php(调度功能)
$schedule->call(function ()
$checkSubStatus = UserSubscription::where('status', 'approved')->where('users_id', auth()->user()->id)->first();
$currentTime = Carbon::now();
if($currentTime > $checkSubStatus->expiry_date)
$checkSubStatus->update([
'status' => 'expired'
]);
)->everyMinute();
但是当我只删除表时有效,例如 DB::table('users_subscription')->delete(); 请帮忙?
【问题讨论】:
是任务调度器不工作还是闭包(函数)里面的代码?我的意思是,你确定这段代码被执行了吗? 一旦我运行 php artisan schedule:work,任务调度程序就会工作,但代码不会被执行,除非我尝试其他方法,例如删除表 您正在尝试使用会话信息获取用户 ID,但它不适用于排队或计划的作业,因为该时间不存在会话。因此,您可能在此块“auth()->user()->id”中遇到错误 天哪..还有其他选择吗?? 你说的非常对,当我在其中硬编码一个 id 时它就可以工作,有没有办法解决这个问题? 【参考方案1】:auth()->user()->id
导致了一个异常,因为执行闭包时没有记录任何用户。
您可以查看storage/logs/laravel.log
中的日志,如果是这种情况,解决方案就是避免在调度程序中使用任何身份验证机制。
作为替代方案,您必须重新考虑应该过期的 UserSubscription
:
UserSubscription::where('status', 'approved')
->where('expiry_date', '<', now())
->update(['status' => 'updated');
不再有用户,您只需将日期之前的每个订阅都过期。
感谢 Emre Kaya 发现错误。
【讨论】:
事实上,我更新了我的答案。 Emre Kaya,如果你写了一个答案,我会很高兴删除我的。 你是对的,我可以看到错误日志...关于在 null 上调用 update 函数的一些事情,这表明 id 不起作用。有什么解决办法吗? 我更新了我的答案,也许它可以帮助你,如果你有任何问题告诉我 该死的..有史以来最好的答案,非常感谢,它工作得很好..我怎么没有这样想..lol.非常感谢 没问题 :) 我看到你是 SO 新手,不要忘记验证答案(这里和你的其他问题),以便其他有相同错误的人可以快速理解这是他们在寻找什么。祝你有美好的一天。以上是关于Laravel 8 任务调度器的主要内容,如果未能解决你的问题,请参考以下文章