队列
队列配置文件存储在 config/queue.php 中
优点:
解耦:消息队列可以对系统进行解耦,提高响应速度,系统功能向内聚合,对外开放;
异步:消息队列可以对系统异步功能进行剥离,减少功能耦合,提供开发效率;
削峰:消息队列可以削峰限流,确保下游消费者稳定运行。
我这里用的redis做队列。【redis一定要安装】
如果没有安装php redis扩展。也可以利用composer安装predis.
在你的项目根目录下运行即可。
composer require predis/predis
同时database.php修改
.env文件
QUEUE_CONNECTION=redis
REDIS_PASSWORD=root
创建队列
php artisan make:job HelloWord
文件默认存放在 App\Jobs 目录下。
任务分发
参数设置:
onQueue: 指定队列;
onConnection: 指定连接;
delay: 延迟队列;
dispatchNow: 同步调度;
<?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;
use Illuminate\Support\Facades\Log;
class HelloWord implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
Log::info('HelloWord');#向日志写入HelloWord
}
}
消费队列
通过 Artisan 命令queue:work 来启动队列处理器。需要注意的是,一旦 queue:work 命令启动,将一直保持运行,直到它被手动停止或你关闭你的终端。
开始测试时redis客户端一定要开启
1.启动服务
php artisan serve
路由配置:
Route::get('hello',function (){
dispatch(new \App\Jobs\HelloWord());
});
2.开始消费队列
php artisan queue:work
3.访问 http://127.0.0.1:8000/hello
storage\logs\laravel.log
这只是一个非常简单的一个例子, 刚刚开始学,如果你有更好的例子,希望可以分享一下。
任务调度
任务调度 顾名思义即 根据事件的先后以及任务的优先级安排任务的执行。定时任务也叫 计划任务。
任务调度定义在 app/Console/Kernel.php 文件的 schedule方法中:
方法 | 描述 |
---|---|
->cron(’* * * * *’); | 自定义 Cron 计划执行任务 |
->everyMinute(); | 每分钟执行一次任务 |
->hourly(); | 每小时执行一次任务 |
->hourlyAt(17); | 每小时第 17 分钟执行一次任务 |
->daily(); | 每天 00:00 执行一次任务 |
->dailyAt(‘13:00’); | 每天 13:00 执行一次任务 |
->twiceDaily(1, 13); | 每天 01:00 和 13:00 各执行一次任务 |
->weekly(); | 每周日 00:00 执行一次任务 |
->weeklyOn(1, ‘8:00’); | 每周一 08:00 执行一次任务 |
->monthly(); | 每月第 1 天 00:00 执行一次任务 |
->monthlyOn(4, ‘15:00’); | 每月第 4 天 15:00 执行一次任务 |
->twiceMonthly(1, 16, ‘13:00’); | 每月第 1 天和第 16 天的 13:00 各执行一次任务 |
->lastDayOfMonth(‘15:00’); | 每月最后一天 15:00 执行一次任务 |
->quarterly(); | 每季度第 1 天 00:00 执行一次任务 |
->yearly(); | 每年第 1 天 00:00 执行一次任务 |
->yearlyOn(6, 1, ‘17:00’); | 每年 6 月第 1 天 17:00 执行一次任务 |
->timezone(‘America/New_York’); | 设置时区 |
先在app/Console/Kernel.php 做个闭包测试
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
$schedule->call(function (){
Log::info('任务调度测试');
})->everyMinute();
//命令调度
$schedule->command('hello')->everyMinute();
//队列调度
$schedule->job(new HelloWord())->everyMinute();
}
执行 php artisan schedule:run
队列就到这了,看到队列这把我看懵了,如果有谁知道比较好的例子,希望可以推荐一下。