php-如何做异步。处理在队列中添加任务?

时间:2014-11-27 10:14:31

标签: php curl asynchronous

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

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

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

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

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

所有短信都应该在后台发送。我怎么能这样做?

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

按照以下流程:

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

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

答案 1 :(得分:-1)

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

答案 2 :(得分:-2)

我使用的是:

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是一个数组。