批量发送短信?

思路是这样 前台点个按钮,后台直接返回成功,后台继续执行查询数据库写入redis,然后队列发送信息。又没有这样的案例或思路?

阅读 1.8k
2 个回答

这个思路可以实现一种异步批量发送短信的方式,在不影响前台响应时间的情况下,可以在后台进行短信发送和数据库操作等耗时操作。
下面是一种可能的实现方式:

  1. 前台点击发送短信按钮,向后台发起一次Ajax请求,后台返回一个JSON格式的响应,表示后台已经开始异步发送短信。
  2. 后台接收到Ajax请求后,立即返回一个JSON响应,表示请求已经成功,可以进行后续操作。
  3. 后台接着查询数据库,从中获取手机号码列表和短信内容等信息,然后将这些信息写入Redis缓存中。这样做的好处是,Redis缓存可以在高并发的情况下提高查询速度,并且可以实现分布式操作。
  4. 再次在后台启动一个异步任务,使用Redis中的数据发送短信,发送短信过程中,如果出现了异常,可将异常信息记录到日志中进行分析和排查。
    下面是一个简单的代码示例(仅供参考):

    // 前台Ajax请求发送短信
    $.ajax({
     url: '/send-sms',
     data: {template_id: 123, mobiles: ['13800138000', '13800138001'], content: '这是一条测试短信'},
     method: 'POST',
     success: function(result) {
         alert('发送短信请求已经发送');
     }
    });
    // 后台接收短信发送请求
    public function sendSms() {
     $templateId = $_POST['template_id']; // 短信模板ID
     $mobiles = $_POST['mobiles']; // 手机号码列表
     $content = $_POST['content']; // 短信内容
     // 返回Ajax响应
     echo json_encode(array('success' => true, 'msg' => '短信发送请求已经发送'));
     // 异步任务发送短信
     $this->sendSmsAsync($templateId, $mobiles, $content);
    }
    // 异步发送短信任务
    private function sendSmsAsync($templateId, $mobiles, $content) {
     $redis = new Redis();
     $redis->connect('127.0.0.1', 6379);
     $redis->auth('redis_password');
     // 将发送短信相关数据存入Redis缓存中
     $data = array('template_id' => $templateId, 'mobiles' => $mobiles, 'content' => $content);
     $redis->lPush('sms_queue', json_encode($data));
     // 异步发送短信任务
     exec('nohup php -f ' . BASEPATH . 'index.php sms/send >/dev/null 2>&1 &');
    }
    // 发送短信任务(CLI脚本方式调用)
    public function send() {
     $redis = new Redis();
     $redis->connect('127.0.0.1', 6379);
     $redis->auth('redis_password');
     // 从Redis缓存中获取短信发送相关数据
     $dataStr = $redis->rPop('sms_queue');
     if (!$dataStr) {
         exit;
     }
     $data = json_decode($dataStr, true);
     // 调用短信服务商API发送短信
     $templateId = $data['template_id'];
     $mobiles = $data['mobiles'];
     $content = $data['content'];
     $result = $this->sendSms($templateId, $mobiles, $content);
     // 写入日志文件
     if ($result !== true) {
         $msg = '发送短信失败:' . $result;
         file_put_contents('/path/to/log.txt', $msg . PHP_EOL, FILE_APPEND);
     }
     // 继续发送下一条短信任务
     exec('nohup php -f ' . BASEPATH . 'index.php sms/send >/dev/null 2>&1 &');
    }

    这个示例代码中使用Redis作为消息队列,将要发送的短信数据存入Redis队列中,再调用异步任务来发送短信。可以在异步任务中调用短信服务商的API接口来发送短信,并在出现异常时记录到日志中进行分析和排查。需要注意的是,为了避免出现异常而导致的连续发送短信失败的情况,可以通过添加异常处理机制来确保程序的健壮性。

看看这个方法:fastcgi_finish_request

通过这个方法可以实现。先输出对应的json内容。然后执行该函数,主动断开与客户端的链接。然后继续执行后续任务(查询数据库写入redis,然后队列发送信息)。

但是这种是简单的处理方式。如果你的短信请求量超级高的话。可以通过队列的方式去实现。

因为队列的就是用来削峰填谷的。😁

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题