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

Laravel 向使用作业的用户发送多条短信,laravel,sms,scheduled-tasks,jobs,guzzle,Laravel,Sms,Scheduled Tasks,Jobs,Guzzle,我有大约2.5万个用户,我想为每个用户发送短信 我做了下面的工作 <?php namespace App\Jobs; use App\User; use App\Jobs\Job; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use GuzzleHttp\Client; use Guzzl

我有大约2.5万个用户,我想为每个用户发送短信

我做了下面的工作

<?php
namespace App\Jobs;
use App\User;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use GuzzleHttp\Client;
use GuzzleHttp\Post\PostBodyInterface;
use GuzzleHttp\Exception\ClientException;

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 \GuzzleHttp\Client(['base_uri' => "example.com"]);

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

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

        }
    }

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

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

为了获得更好的性能,可以使用Guzzle的异步功能,或者将SMS作业分派到多个队列,并并行运行多个队列工作程序,每个队列使用参数
--queue=myqueue
。拥有25k用户是使用多个队列的充分理由


例如,您可以创建10个队列:以0结尾的电话号码为“sms-0”,以1结尾的电话号码为“sms-1”。。。等等或者你可以为奇数或偶数创建两个队列,“sms odd”和“sms偶数”。

看看这个:尝试做异步请求,速度快得多,但即使完成了,也没有到达用户显示我将为手柄内的每个用户分派作业?与你在控制器中已经使用的方式完全相同:
$this->dispatch($job)
。只需记住包含
illumb\Foundation\Bus\DispatchesJobs
特性
<?php

namespace App\Http\Controllers;
use App\Jobs\SendSMS;

use Illuminate\Http\Request;
use App\User;
use App\Http\Requests;
use App\Http\Controllers\Controller;

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/>";
        }
    }
}