You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段存储已触发的阈值,扩展性更好:

  1. 添加JSON字段的迁移:
Schema::table('snippets', function (Blueprint $table) {
    $table->json('triggered_notifications')->default('[]');
});
  1. 修改触发逻辑:
$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:35:23