使用作业向用户发送多条短信 [英] Send Multiple SMS to users using Jobs
本文介绍了使用作业向用户发送多条短信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有大约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
作业将获取所有用户,并为每个用户调度一个新作业。
IlluminateFoundationBusDispatchesJobs
特征并使用$this->dispatch($job)
方法。
为了获得更好的性能,要么使用GUZLE的异步功能,要么将您的短信作业调度到多个队列,并并行运行几个队列工作进程,使用参数--queue=myqueue
每个队列一个。拥有25K个用户就足以支持使用多个队列。
这篇关于使用作业向用户发送多条短信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文