异步批量短信发送:提升效率,优化用户体验
批量发送短信是许多应用的常见需求,例如用户注册、活动通知等。如何既保证效率,又不影响用户体验呢?本文介绍一种基于前台触发、后台异步处理的方案。用户点击发送按钮后,系统立即返回确认信息,后台则异步执行数据库查询、缓存写入以及短信发送等操作。
实现步骤详解
-
前台ajax请求: 用户点击发送按钮,前台使用ajax向后台发送请求,避免页面刷新,提升用户体验。
$.ajax({ url: '/send-sms', type: 'post', data: {template_id: 123, mobiles: ['13800138000', '13800138001'], content: '测试短信'}, success: function(result) { alert('短信发送请求已提交'); } });
登录后复制 -
后台快速响应: 后台收到请求后,立即返回成功响应,无需等待耗时操作完成。
public function sendsms() { $templateid = $_post['template_id']; $mobiles = $_post['mobiles']; $content = $_post['content']; // 返回json响应 echo json_encode(['success' => true, 'message' => '请求已提交']); // 异步处理短信发送 $this->asyncsendsms($templateid, $mobiles, $content); }
登录后复制 -
异步任务处理: 后台异步任务首先从数据库获取短信数据,写入redis缓存。
private function asyncsendsms($templateid, $mobiles, $content) { $redis = new redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('redis_password'); // 将数据存入redis队列 $data = ['template_id' => $templateid, 'mobiles' => $mobiles, 'content' => $content]; $redis->lpush('sms_queue', json_encode($data)); // 启动异步任务 (使用合适的异步任务处理机制,例如队列管理器) // ... }
登录后复制 -
队列发送短信: 异步任务从redis队列获取数据,调用短信服务商api发送短信。错误信息会被记录到日志中,方便后续排查。
public function processsmsqueue() { $redis = new redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('redis_password'); // 从redis队列获取数据 $datastr = $redis->rpop('sms_queue'); if ($datastr) { $data = json_decode($datastr, true); // 调用短信服务商api $result = $this->sendsmsapi($data['template_id'], $data['mobiles'], $data['content']); // 记录日志 if ($result !== true) { error_log("短信发送失败: " . $result); } // 继续处理队列中的下一条消息 // ... } }
登录后复制
此方案通过前台ajax和后台异步任务,有效地将短信发送与用户交互分离,提高了系统效率和用户体验。 请根据实际情况选择合适的异步任务处理机制,例如使用消息队列服务(如rabbitmq、kafka)或进程管理工具(如supervisor)。
以上就是如何通过前台按钮触发和后台异步处理实现高效的批量发送短信?的详细内容,更多请关注代码网其它相关文章!
发表评论