PHP - 如何进行异步.处理以在队列中添加任务


php- how to do async. processing to add tasks in queue?

>我有一个短信API,可以发送短信。我想用它来批量发送短信。

用户一次最多可以输入30,000个号码并发送短信。我正在使用的方法可能是一个非常糟糕的方法:

foreach ($targets as $target) {
   sendSms($target,$text,$extra_parms):
}

处理 10,000 个请求 (SMS) 需要 10 分钟,而且太多了。我想要的是当用户应该单击"发送"按钮时,他应该收到如下消息:

"您的短信已添加到要发送的队列中"

并且所有短信都应在后台发送。我该怎么做?

感谢您的帮助。

遵循以程:

  • 而不是直接调用 API,将所有数据插入您的数据库。
  • 在数据库中添加数字和文本后,显示用户消息"您的短信已添加到要发送的队列中"
  • 用户后台进程,它将从数据库获取数据并使用 http://www.php.net/manual/en/function.curl-multi-exec.php 调用异步 API 请求
  • 更新/删除数据库中已处理的API记录,以便下次只能获取未处理的数据。

请注意:正常的 CURL 请求使用同步,它会等待响应,这会延迟。

创建队列,即在数据库中,并将所有SMS操作放在那里。创建单独的脚本来发送SMS(批量发送,就像整个一样),并定期启动(即使用Curl)来处理您的队列。

这就是我使用的:

function fast_post($url,$data){
    ignore_user_abort(true);
    $ch = curl_init();
    $defaults = array( 
         CURLOPT_POST => 1,
         CURLOPT_HEADER => 0,
         CURLOPT_URL => $url,
         CURLOPT_FRESH_CONNECT => 1,
         CURLOPT_RETURNTRANSFER => 1,
         CURLOPT_FORBID_REUSE => 1,
         CURLOPT_TIMEOUT => 1,
         CURLOPT_POSTFIELDS => http_build_query($data)
     );
    curl_setopt_array($ch, $defaults);
    curl_exec($ch);
    curl_close($ch);
}

请注意,在此函数中,$data是一个数组。