Laravel中基于文章浏览量推送通知:解决重复推送问题
解决Laravel文章浏览量阈值重复发通知的问题
你的问题核心是当浏览量刚好达到1000时,并发请求或重复触发条件导致多次发送通知——仅靠Cookie防重复计数无法解决这个问题,因为Cookie是针对单个用户的,而浏览量计数是全局的,只要多个用户同时触发浏览量从999到1000的变化,就会多次进入$views ==1000的判断分支。
最可靠的解决方式是在文章模型中添加标记,记录该阈值的通知是否已发送,确保只发一次:
步骤1:给文章表添加标记字段
如果只针对1000次浏览量的通知,添加一个时间戳字段记录通知发送时间:
// 创建迁移文件 php artisan make:migration add_notified_at_1000_views_to_snippets_table
在迁移文件中编写:
public function up() { Schema::table('snippets', function (Blueprint $table) { $table->timestamp('notified_at_1000_views')->nullable(); }); } public function down() { Schema::table('snippets', function (Blueprint $table) { $table->dropColumn('notified_at_1000_views'); }); }
执行迁移:
php artisan migrate
步骤2:修改通知触发逻辑
在你的计数代码中,同时检查标记字段是否为空(即未发送过通知),发送后立即更新标记:
// 假设$article是当前文章的模型实例 if($views == 1000 && is_null($article->notified_at_1000_views)){ $user = User::find($userid); $notificationdetails = [ 'subject' => '恭喜!你的新片段《'.$snippet_title.'》浏览量突破'.$views.'次啦', 'greeting' => '你好,'.$user->name, 'body' => '恭喜!你的新片段《'.$snippet_title.'》浏览量突破'.$views.'次啦', 'body1' =>'', 'thanks' => ' ', 'actionText' => '查看片段', 'actionURL' => url(env('FRONTEND_URL').'/snippets/'.$slug) ]; Notification::send($user, new BBBnotifications($notificationdetails)); // 更新标记,避免重复发送 $article->update(['notified_at_1000_views' => now()]); }
扩展:支持多阈值通知
如果后续需要针对2000、5000等多个浏览量阈值发通知,可以用JSON字段存储已触发的阈值,扩展性更好:
- 添加JSON字段的迁移:
Schema::table('snippets', function (Blueprint $table) { $table->json('triggered_notifications')->default('[]'); });
- 修改触发逻辑:
$triggeredThresholds = json_decode($article->triggered_notifications, true); $currentThreshold = 1000; if($views == $currentThreshold && !in_array($currentThreshold, $triggeredThresholds)){ // 发送通知逻辑同前 // 更新已触发阈值数组 $triggeredThresholds[] = $currentThreshold; $article->update(['triggered_notifications' => json_encode($triggeredThresholds)]); }
这样不管后续加多少阈值,都不需要修改表结构,直接调整阈值数值即可。
内容的提问来源于stack exchange,提问作者Hitesh Chauhan
相关产品推荐
相关产品推荐

