如何在Laravel项目中使用minishlink/web-push批量发送通知?
批量发送Web Push通知(基于minishlink/web-push包)
minishlink/web-push包原生支持批量发送通知,你可以用sendNotifications()方法替代当前的sendOneNotification(),该方法接收订阅对象数组和通知内容(支持统一内容或个性化内容)。
实现示例代码
Route::post("/admin/sendBulkNotif", function(Request $request){ // 1. 获取所有有效订阅记录(可根据业务需求添加筛选条件,比如排除过期/无效订阅) $subscriptions = PushSubscription::all(); // 2. 转换为Subscription对象数组 $subscriptionList = []; foreach ($subscriptions as $sub) { $subscriptionList[] = Subscription::create(json_decode($sub->data, true)); } // 3. 初始化WebPush实例(保持原有VAPID配置) $webPush = new WebPush([ "VAPID" => [ "publicKey" => "BNbqX8M5NJJ...", "privateKey" => "i4I89hSrn-MGvp...", "subject" => "https://example.com" ] ]); // 4. 批量发送通知 $notificationContent = json_encode($request->input()); $webPush->sendNotifications($subscriptionList, $notificationContent); // 可选:处理推送结果,记录失败的订阅 foreach ($webPush->flush() as $report) { $subscription = $report->getSubscription(); if (!$report->isSuccess()) { \Log::error("推送失败:{$report->getReason()}", ['endpoint' => $subscription->getEndpoint()]); // 可额外逻辑:标记该订阅为无效,后续不再推送 } } return redirect("/"); });
关键细节说明
- 若需给不同订阅发送个性化内容,可将
sendNotifications()的第二个参数改为内容数组,确保数组元素顺序和订阅数组一一对应 flush()方法会返回每条推送的结果报告,便于排查失败原因、清理无效订阅- 批量推送可能耗时较长,建议结合Laravel队列异步执行,避免阻塞请求
内容的提问来源于stack exchange,提问作者MMD
相关产品推荐
相关产品推荐

