【发布时间】:2021-07-21 20:23:13
【问题描述】:
我的用户可以发布广告,然后用他们购买的代币进行宣传。 对于每种类型的促销,我都有 pro_until、vip_until 等列。
它们是时间戳并保存到秒。
当用户将他的广告宣传为 vip 3 天时,我将 now()->addDays(3) 保存到 vip_until 列。
那么问题出在哪里: 我的用户需要有一个带有通知的仪表板,其中一些是关于广告促销到期的通知。类似于 “22/03/2020 15:30:20 - 您的广告 111 的 VIP 已过期”
以下是我尝试/思考过的事情以及它们的效果:
Cron 作业:
我可以每分钟运行一次 cron 作业并检查过期列 $ad->vip_until->lt(now())。
问题是:我如何只通知这个过期广告一次?
我无法检查 now() 和 {type}_until 之间的完全匹配,因为 cron 每分钟执行一次,并且我将 {type}_until 列保持在精确的秒数,所以完全有可能没有总匹配。
延迟通知:
我尝试在创建促销https://laravel.com/docs/8.x/notifications#queueing-notifications时对过期通知进行排队。
我添加了->delay() 回调
实现了 ShouldQueue 接口
使用了 Queueable 特征
添加了队列工作者
但通知是立即推送的。
$delay = null;
if ($request->type == 'pro') {
$delay = $ad->promotePro($request->days);
}
if ($request->type == 'top') {
$delay = $ad->promoteTop($request->days);
}
if ($request->type == 'vip') {
$delay = $ad->promoteVip($request->days);
}
Auth::user()->payed -= $price;
Auth::user()->save();
if ($delay) {
Auth::user()->notify((new AdPromotionEndedNotification($ad, $request->type))->delay($delay));
}
【问题讨论】:
-
这个问题有很多可能的解决方案,并不适合常见问题解答格式。
-
“我的用户需要一个带有通知的仪表板,其中一些是关于广告促销到期的通知。”所以你想在某个页面列出广告促销到期。在这种情况下,您只能获取将在未来 X 天到期的广告并在此仪表板中显示它们。如果您想发送电子邮件或其他通知,您可以在表格中添加一个标志,该标志将标记通知已发送并且您不会再次发送。
-
@EmilGeorgiev 我只需要在广告过期后展示它们。我显示的消息是“您的广告 XXXX 的 VIP 已过期。”
-
你确定你的环境没有设置为同步?
标签: php laravel scheduled-tasks