如何在Web應用中通過異步處理高效實現批量發送短信?

如何在Web應用中通過異步處理高效實現批量發送短信?

Web應用異步批量短信發送策略

本文探討如何在Web應用中高效實現批量短信發送,尤其是在不影響用戶界面響應速度的前提下,異步處理后臺的數據庫查詢、redis寫入和短信發送等復雜操作。 關鍵在于采用異步處理機制。

實現步驟:

  1. 前端觸發: 用戶點擊發送按鈕,觸發ajax請求,通知后臺開始短信發送流程。 請求僅告知后臺開始處理,無需等待短信發送完成。

    $.ajax({     url: '/send-sms',     data: {template_id: 123, mobiles: ['13800138000', '13800138001'], content: '測試短信'},     method: 'POST',     success: function(result) {         alert('短信發送請求已提交');     } });
  2. 后臺快速響應: 后臺接收Ajax請求后,立即返回成功響應,不阻塞等待短信發送完成。

    public function sendSms() {     $templateId = $_POST['template_id'];     $mobiles = $_POST['mobiles'];     $content = $_POST['content'];     // 返回Ajax響應     echo json_encode(['success' => true, 'msg' => '短信發送請求已接收']);     // 異步處理短信發送     $this->sendSmsAsync($templateId, $mobiles, $content); }
  3. redis緩存與異步任務: 后臺啟動異步任務,將短信發送數據(模板ID、手機號列表、短信內容)寫入Redis緩存。Redis的高效性保證了數據的高速讀寫,并支持分布式環境。

    private function sendSmsAsync($templateId, $mobiles, $content) {     $redis = new Redis();     $redis->connect('127.0.0.1', 6379);     $redis->auth('redis_password');     $data = ['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 &'); }
  4. 短信發送任務: 獨立的CLI腳本從Redis隊列中獲取短信發送任務,調用短信服務商API發送短信。 錯誤信息會被記錄到日志中,方便后續排查。

    public function send() {     $redis = new Redis();     $redis->connect('127.0.0.1', 6379);     $redis->auth('redis_password');     $dataStr = $redis->rPop('sms_queue');     if (!$dataStr) {         exit;     }     $data = json_decode($dataStr, true);     // 調用短信服務商API發送短信     $result = $this->sendSmsApi($data['template_id'], $data['mobiles'], $data['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 &'); }

此方案確保了用戶體驗的流暢性,并提升了短信發送的效率和穩定性。 實際應用中,可根據需求添加更完善的錯誤處理和日志記錄機制。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享