当前位置: 首页 > 后端技术 > PHP

Laravel实现队列

时间:2023-03-30 03:41:39 PHP

1:队列配置队列的配置文件放在config/queue.php文件中。laravel框架中支持的队列驱动有:sync、database、beanstalkd、sqs、redis,null对应:synchronization(localUse)driver、databasedriver、beanstalkd、AmazonSQS、redis、nullqueuedriverfortasksthatabandonthequeue1:队列相关配置(一):队列驱动配置'default'=>env('QUEUE_DRIVER','sync'),//队列驱动设置(二):不同驱动相关配置'connections'=>[////syns驱动配置'sync'=>['driver'=>'sync',],////database驱动配置'database'=>['driver'=>'database','table'=>'jobs',//Database'queue'=>'default','retry_after'=>90,//指定任务处理完成后的最大秒数,会作为失败重试,比如如果这样option设置为90,那么当任务继续执行90秒没有被删除时,就会被释放回队列],//beanstalkd驱动配置'beanstalkd'=>['driver'=>'beanstalkd','host'=>'localhost',//使用beanstalkd驱动地址'queue'=>'default','retry_after'=>90,//指定任务处理后的最大秒数为失败重试,对于例如,如果这个选项设置为90,那么当任务继续执行90秒没有被删除时,它会被释放回队列'block_for'=>0,],//sqsdriverconfiguration'sqs'=>['德里ver'=>'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):数据库驱动使用数据库驱动,需要生成一个队列驱动表phpartisanqueue:tablephpartisanmigrate执行上面的命令后,会发现数据库中会增加一个jobs表(二):Redis驱动需要安装predis/predisextensioncomposer以使用redis驱动requirepredis/predis(3):AmazonSQSdriverneedstoinstallaws/aws-sdk-phpextensionco使用AmazonSQS驱动时的mposer需要aws/aws-sdk-php(4):Beanstalkd驱动需要安装pda/pheanstalkextensioncomposerrequirepda/pheanstalk2:createqueuetaskphpartisanmake:jobTestJobs执行上面的命令创建一个队列任务类。这时会在app/jobs目录下生成一个TestJobs.php文件的简单队列任务类实例:info=$info;}/***执行作业。**@returnvoid*/publicfunctionhandle(){//$user=newUser();$user->user_no=$this->info['user_no'];$user->user_name=$this->info['user_name'];$用户->保存();}}三:任务分配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');//表示使用默认驱动的处理队列4:指定驱动分发TestJobs::dispatch($info)->onConnection('redis');//使用redis驱动的默认队列5:指定分发TestJobs的驱动和队列::dispatch($info)->onConnection('redis')->onQueue('processing');//使用redis驱动的处理队列4:任务处理phpartisanqueue:工作执行完后,我们会发现user表多了一个user_no,也就是006,user_name是testName数据,但是如果你指定了驱动和队列,此时执行phpartisanqueue:work,你会发现没有数据添加到数据库中,这是因为phpartisanqueue:work命令是针对默认驱动和'default'队列监控,此时使用:phpartisanqueue:workredis--queue="processing"//redis表示指定驱动处理表示指定队列五:失败任务处理phpartisanqueue:failed-tablephpartisanmigrate执行以上命令后会在数据库中添加一张failed_jobs表,专门用来存放失败的任务信息,并在TestJobs类中添加一个failed方法来处理失败队列/***待处理的失败任务**@paramException$exception*@returnvoid*/publicfunctionfailed(Exception$exception){//向用户发送失败通知等...}失败,我们可以在Laravel的app中在/Providers/AppServiceProvider.php文件中为这个事件添加一个回调函数/***启动任意应用的服务。**@returnvoid*/publicfunctionboot(){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(一):在/etc/supervisord.conf文件中配置supervisord.conf在最后一行添加files=supervisord.d/*.ini(2):Queue进程配置创建一个.ini/etc/supervisord.d/目录下的文件[program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php/home/forge/app.com/artisanqueue:workdatabase--sleep=3--tries=3#/home/forge/app.com是项目地址autostart=trueautorestart=trueuser=forgenumprocs=8#numprocs命令会要求Supervisor运行并监控8个队列:workprocessredirect_stderr=truestdout_logfile=/home/forge/app.com/worker.log3:启动Supervisorsystemctlstartsupervisord.servicesupervisorctlupdatesupervisorctlreloadsupervisor控制星tlaravel工人