由网友(闭眼听风)分享简介:我有大约25K个用户,我想为他们每个人发送短信。我做了以下工作<?phpnamespace AppJobs;use AppUser;use AppJobsJob;use IlluminateQueueSerializesModels;use IlluminateQueueInteractsWithQueue;...![如何新建微信号](https://p.xsw88.cn/allimgs/daicuo/20230904/81.png)
我有大约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]);
}
}
![如何新建微信号](https://p.xsw88.cn/allimgs/daicuo/20230904/81.png)
我正在使用作业控制器分派作业
<?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个用户就足以支持使用多个队列。
相关推荐
最新文章