讨论数量:
弄个定时任务,频率就是你需求所要的最小频率为单位,比如,你上面要求的最小粒度是每天,那你的定时任务就设置为每天执行一次,然后PHP脚本里面,通过代码判断你客户当前设置的频率,如果是每天,就执行。如果设置的是每周一,那你判断今天试不是周一,是就执行,不是就退出,以此类推
写一个监听redis key过期任务 ,每次创建任务、计算第一次发送时间距离现在多久,设置key的过期时间。 每次监听到了,就去数据库查询发送任务、执行发送任务、然后计算下一次发送时间。
楼上的兄弟们说的都对,我没啥可补充的了。个人觉得一楼的方案就可以了,不用弄的很复杂。
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
$schedule->call(function(){
$now = \Carbon\Carbon::now();
$nowStr = $now->toDateTimeString();
\App\Models\AutoSendReport::where('开始日期', '<=', $nowStr)
->where('结束日期', '>=', $nowStr)
->get()
->map(function($plan)use($now){
$shouldSend = false;
switch ($plan->频率) {
case '每天':
// 每天上午 10 点发送
$shouldSend = true;
break;
case '每周':
// 每周一发送
$shouldSend = $now->isMonday();
break;
case '每月':
// 每月第一天发送
$shouldSend = $now->day == 1;
break;
}
if($shouldSend){
\Mail::to($plan['收件人邮箱'], $plan['收件人姓名'])->send(new \Illuminate\Mail\Mailable());
}
});
})
->timezone('Asia/Shanghai')
// 每天上午 10 点执行一次
->dailyAt('10:00');
}
}
详细的频率设置参考 文档
写一个监听redis key过期任务 ,每次创建任务、计算第一次发送时间距离现在多久,设置key的过期时间。 每次监听到了,就去数据库查询发送任务、执行发送任务、然后计算下一次发送时间。