一、免费申请rabbitmq账号
管理世界上最大的RabbitMQ集群
rabbitmq管理器
二、 安装rabbitmq软件包
官方地址
composer require vladimir-yuldashev/laravel-queue-rabbitmq
三、配置
| |
| 'connections' => [ |
| 'rabbitmq' => [ |
| 'driver' => 'rabbitmq', |
| 'queue' => env('RABBITMQ_QUEUE', 'default'), |
| 'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class, |
| 'hosts' => [ |
| [ |
| 'host' => env('RABBITMQ_HOST', '127.0.0.1'), |
| 'port' => env('RABBITMQ_PORT', 5672), |
| 'user' => env('RABBITMQ_USER', 'guest'), |
| 'password' => env('RABBITMQ_PASSWORD', 'guest'), |
| 'vhost' => env('RABBITMQ_VHOST', '/'), |
| ], |
| ], |
| 'options' => [ |
| 'ssl_options' => [ |
| 'cafile' => env('RABBITMQ_SSL_CAFILE', null), |
| 'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null), |
| 'local_key' => env('RABBITMQ_SSL_LOCALKEY', null), |
| 'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true), |
| 'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null), |
| ], |
| 'queue' => [ |
| 'job' => VladimirYuldashev\LaravelQueueRabbitMQ\Queue\Jobs\RabbitMQJob::class, |
| ], |
| ], |
| /* |
| * Set to "horizon" if you wish to use Laravel Horizon. |
| */ |
| 'worker' => env('RABBITMQ_WORKER', 'default'), |
| ], |
| |
| ], |
| |
| QUEUE_CONNECTION=rabbitmq |
| |
| |
| RABBITMQ_HOST=shark.rmq.cloudamqp.com |
| RABBITMQ_PORT=5672 |
| RABBITMQ_USER=xxx |
| RABBITMQ_PASSWORD=xxx |
| RABBITMQ_VHOST=xxx |
| RABBITMQ_QUEUE=admin_queue |
四、使用
| php artisan make:job TestJob |
| <?php |
| |
| namespace App\Jobs; |
| |
| use Illuminate\Bus\Queueable; |
| use Illuminate\Contracts\Queue\ShouldBeUnique; |
| use Illuminate\Contracts\Queue\ShouldQueue; |
| use Illuminate\Foundation\Bus\Dispatchable; |
| use Illuminate\Queue\InteractsWithQueue; |
| use Illuminate\Queue\SerializesModels; |
| |
| class TestJob implements ShouldQueue |
| { |
| use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; |
| private array $data = []; |
| public function __construct($data) |
| { |
| $this->data = $data; |
| } |
| public function handle() |
| { |
| sleep(3); |
| var_dump($this->data); |
| } |
| } |
在队列处理任务时,会调用 handle 方法,而这里我们也可以通过 handle 方法的参数类型提示,让 Laravel 的 服务容器 自动注入依赖对象。
如果你想完全控制容器如何将依赖对象注入至 handle 方法,可以使用容器的 bindMethod 方法。bindMethod 方法接受一个任务和容器的回调。虽然可以直接在回调中可以调用 handle 方法,但建议应该从 service provider 调用为佳:
| |
| |
| use App\Jobs\ProcessPodcast; |
| |
| $this->app->bindMethod(ProcessPodcast::class.'@handle', function ($job, $app) { |
| return $job->handle($app->make(AudioProcessor::class)); |
| }); |
| \App::bindMethod(TestJob::class . '@handle', function ($job){ |
| return $job->handle(); |
| }); |
| //php7.4写法 |
| \App::bindMethod(ProductCreated::class . '@handle', fn($job) => $job->handle()); |
| use App\Jobs\TestJob; |
| |
| TestJob::dispatch(['title'=>'111111111'])->onQueue('admin_queue');; |
五、启动
| # |
| # |
| php artisan serve |
| php artisan queue:work |