一:队列配置
队列的配置文件搁置在config/queue.php文件中,laravel框架中反对的队列驱动有:sync, database, beanstalkd, sqs, redis,null对应着:同步(本地应用)驱动,数据库驱动,beanstalkd ,Amazon SQS ,redis,null 队列驱动用于那些放弃队列的工作
1:队列相干配置
(1):队列驱动配置
'default' => env('QUEUE_DRIVER', 'sync'),//队列驱动设置
(2):不同驱动相干配置
'connections' => [ ////syns驱动配置 'sync' => [ 'driver' => 'sync', ], ////数据库驱动配置 'database' => [ 'driver' => 'database', 'table' => 'jobs',//数据库驱动配置应用的数据库 'queue' => 'default', 'retry_after' => 90,//指定了工作最多解决多少秒后就被当做失败重试,比如说,如果这个选项设置为 90,那么当这个工作继续执行了 90 秒而没有被删除,那么它将被开释回队列 ], //beanstalkd驱动配置 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => 'localhost',//应用beanstalkd驱动地址 'queue' => 'default', 'retry_after' => 90,//指定了工作最多解决多少秒后就被当做失败重试,比如说,如果这个选项设置为 90,那么当这个工作继续执行了 90 秒而没有被删除,那么它将被开释回队列 'block_for' => 0, ], //sqs驱动配置 'sqs' => [ 'driver' => 'sqs', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'queue' => env('SQS_QUEUE', 'your-queue-name'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), ], //redis驱动配置 'redis' => [ 'driver' => 'redis', 'connection' => 'default',//应用哪个连贯的redis,redis配置是在config/database.php文件中 'queue' => env('REDIS_QUEUE', 'default'), 'retry_after' => 90, 'block_for' => null, ],],
2:不同队列依赖
(1):数据库驱动
应用数据库驱动须要生成一个队列驱动表
php artisan queue:tablephp artisan migrate
执行下面的命令之后会发现数据库中会减少一个jobs表
(2):redis驱动
应用redis驱动须要装置一个predis/predis 拓展
composer require predis/predis
(3):Amazon SQS驱动
应用Amazon SQS驱动时须要装置aws/aws-sdk-php拓展
composer require aws/aws-sdk-php
(4):Beanstalkd驱动
应用Beanstalkd驱动须要装置pda/pheanstalk拓展
composer require pda/pheanstalk
二:创立队列工作
php artisan make:job TestJobs
执行下面的命令创立一个队列工作类,这时候会发现在app/jobs目录下生成一个TestJobs.php文件
简略的队列工作类实例:
<?phpnamespace App\Jobs;use App\Models\blog\User;use Illuminate\Bus\Queueable;use Illuminate\Queue\SerializesModels;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;class TestJobs implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * 工作最大尝试次数。 * * @var int */ public $tries = 5; /** * 工作运行的超时工夫。 * 指定了 Laravel 队列处理器最多执行多长时间后就应该被敞开掉 * --timeout 应该永远都要比 retry_after 短至多几秒钟的工夫。这样就能保障工作过程总能在失败重试前就被杀死了。 * 如果你的 --timeout 选项大于 retry_after 配置选项,你的工作可能被执行两次 * * @var int */ public $timeout = 120; public $info; /** * Create a new job instance. * * @return void */ public function __construct($info) { // $this->info = $info; } /** * Execute the job. * * @return void */ public function handle() { // $user = new User(); $user->user_no = $this->info['user_no']; $user->user_name = $this->info['user_name']; $user->save(); }}
三:工作散发
1:默认散发
$info = [ 'user_no'=>'006', 'user_name'=>'testName'];TestJobs::dispatch($info);
2:延时散发
TestJobs::dispatch($info)->delay(Carbon::now()->addMinutes(10));//示意延时十分钟散发工作
3:指定队列散发
TestJobs::dispatch($info)->onQueue('processing');//示意应用默认驱动的processing队列
4:指定驱动散发
TestJobs::dispatch($info)->onConnection('redis');//应用redis驱动的默认队列
5:指定驱动和队列散发
TestJobs::dispatch($info)->onConnection('redis')->onQueue('processing');//应用redis驱动的processing队列
四:工作解决
php artisan queue:work
执行后咱们会发现user表中发现多了一条user_no为006,user_name为testName数据,然而如果你指定了驱动和队列的话,这时候执行php artisan queue:work,你就会发现数据库中没有数据加进去,这是因为php artisan queue:work命令是对默认驱动和'default'队列监听,这时候就要应用:
php artisan queue:work redis --queue="processing" //redis示意指定驱动 processing示意指定队列
五:失败工作解决
php artisan queue:failed-tablephp artisan migrate
执行下面命令后会在数据库中减少一张failed_jobs表,专门用于存储失败的工作信息,在TestJobs类中增加一个failed办法解决失败队列
/** * 要解决的失败工作。 * * @param Exception $exception * @return void */public function failed(Exception $exception){ // 给用户发送失败告诉,等等...}
如果你想要注册一个只有当队列工作失败时就会被调用的事件,咱们能够在 Laravel 的 app/Providers/AppServiceProvider.php文件中对这个事件附加一个回调函数即可
/** * 启动任意应用程序的服务。 * * @return void */public function boot(){ Queue::failing(function (JobFailed $event) { // $event->connectionName // $event->job // $event->exception });}
六:应用Supervisor治理队列
一旦应用queue:work 命令,它将始终运行,直到你手动进行或者你敞开控制台,如果你想要让queue:work 命令永恒在后盾运行,这时候能够应用过程监控工具Supervisor来实现永恒在后盾运行
1:Supervisor装置
Supervisor装置能够参考:https://segmentfault.com/a/11...
2:配置Supervisor
(1):配置supervisord.conf
在/etc/supervisord.conf文件的最初一行减少
files = supervisord.d/*.ini
(2):队列过程配置
在/etc/supervisord.d/目录下创立一个.ini文件
[program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php /home/forge/app.com/artisan queue:work database --sleep=3 --tries=3 #/home/forge/app.com为我的项目地址autostart=trueautorestart=trueuser=forgenumprocs=8 #numprocs 命令会要求 Supervisor 运行并监控 8 个 queue:work 过程redirect_stderr=truestdout_logfile=/home/forge/app.com/worker.log
3:启动Supervisor
systemctl start supervisord.servicesupervisorctl updatesupervisorctl reloadsupervisorctl start laravel-worker