使用作业向用户发送多条短信作业、用户发送、多条、短信

由网友(闭眼听风)分享简介:我有大约25K个用户,我想为他们每个人发送短信。我做了以下工作<?phpnamespace AppJobs;use AppUser;use AppJobsJob;use IlluminateQueueSerializesModels;use IlluminateQueueInteractsWithQueue;...

我有大约25K个用户,我想为他们每个人发送短信。

我做了以下工作

<?php
namespace AppJobs;
use AppUser;
use AppJobsJob;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use GuzzleHttpClient;
use GuzzleHttpPostPostBodyInterface;
use GuzzleHttpExceptionClientException;

class SendSMS extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    protected $user;
    public function __construct($user)
    {
        $this->user = $user;
    }

     /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
            $client = new GuzzleHttpClient(['base_uri' => "example.com"]);

            $messageBody = "Message";
            $data = ["messageBody"=>$messageBody,
                    "msisdn"=>$this->user];

            $client->request('POST', 'SendSMS',[ 'json'=>$data]);

        }
    }
如何新建微信号

我正在使用作业控制器分派作业

<?php

namespace AppHttpControllers;
use AppJobsSendSMS;

use IlluminateHttpRequest;
use AppUser;
use AppHttpRequests;
use AppHttpControllersController;

class JobController extends Controller
{

    public function sendSMS()
    {
        $users = User::all(); 
        foreach ($users as $user) 
        {
            $job = (new SendSMS($user->mobile))->onQueue('sms');

            $this->dispatch($job);
            echo $player->mobile;
            echo "<br/>";
        }
    }
}

我使用命令行

运行了队列

现在我有两个问题

第一:请求非常慢,这意味着我等待了大约20秒,等待Http请求完成,然后转到下一个用户,我可以发送请求并转到第二个用户,而不等待短信API的响应吗?

第二:我是否可以在不实际运行控制器中的方法的情况下运行调度,例如,我希望使用命令行或任何其他方法将作业排队。

推荐答案

不是为每个移动用户创建作业,而是创建SendSMSToAllUsers作业,您的请求将非常快速。SendSMSToAllUsers作业将获取所有用户,并为每个用户调度一个新作业。

要在不实际运行控制器中的方法的情况下进行调度,只需在任何类(Arartian命令、队列作业等)中包含IlluminateFoundationBusDispatchesJobs特征并使用$this->dispatch($job)方法。

为了获得更好的性能,要么使用GUZLE的异步功能,要么将您的短信作业调度到多个队列,并并行运行几个队列工作进程,使用参数--queue=myqueue每个队列一个。拥有25K个用户就足以支持使用多个队列。

例如,您可以创建10个队列:‘sms-0’用于以0结尾的电话号码,‘sms-1’用于以1结尾的电话号码,...诸若此类。或者,您可以为奇数或偶数创建两个队列:‘sms-odd’和‘sms-Even’。

阅读全文

相关推荐

最新文章