【问题标题】:php- how to do async. processing to add tasks in queue?php-如何做异步。处理以在队列中添加任务?
【发布时间】:2015-01-25 21:31:08
【问题描述】:

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

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

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

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

“您的短信已添加到发送队列”

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

感谢您的帮助。

【问题讨论】:

  • 有点太宽泛了,但是 cronjob 是个不错的起点
  • 有很多queue managers 可以用于此类任务。这是一个非常普遍的问题,有很多大大小小的库、服务器和服务,旨在解决您可以使用的问题。基本模式是“网页快速将 10,000 个 SMS 作业添加到队列中”/“其他一些进程/服务器/服务器场通过它们并实际发送它们”,但是在您的具体情况下如何做到这一点是一个太宽泛的问题,无法回答在这里,我会说。

标签: php curl asynchronous


【解决方案1】:

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

【讨论】:

    【解决方案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 是一个数组。

    【讨论】:

      【解决方案3】:

      按照以下流程:

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

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

      【讨论】:

        猜你喜欢
        • 2017-09-30
        • 2020-07-08
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 2015-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多