即上一次写了一个简单的队列的逻辑,要把它放到实际应用的框架里,才是真靠谱的,今儿就用laravel5.5框架,学习了一下如何把队列的逻辑放到框架里实际应用起来
1、进入laravel框架根目录,执行命令:php artisan make:command OrderCommand
执行命令会在根目录app/console/commands/下创建一个OrderCommand文件,console 目录是存放创建的任务用的,那么这个命令自然而然就是创建任务和调度
2、进入OrderCommand任务文件,修改任务名称,具体干嘛的我写注释里了
/**
* The name and signature of the console command.
*
* @var string
* @info 这是执行任务的名称,在调用的时候使用
*/
protected $signature = 'command:order';
3、进入OrderCommand任务文件,修改任务描述,这个就是协同工作的时候的一个描述,方便大家都明白这个干嘛的解释
/**
* The console command description.
*
* @var string
* @info 描述
*/
protected $description = '订单处理';
4、进入OrderCommand任务文件,编写业务逻辑
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
while ( true )
{
$a = Redis::rpop('order_mq');
if ( $a )
{
//这个地方是执行业务逻辑的地方
$arrOrder = json_decode($a,true);
DB::table('order')->insert($arrOrder);
}
else
{
usleep(20000);//这里意思是如果这个队列中没有东西,等待两秒
}
}
}
我这里写的就是一个消费的队列。
5、修改console下的kernel.php,命令调度的类
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
\App\Console\Commands\OrderCommand::class,
];
这里后面如果还有添加其他任务就在后面继续添加类的地址
6、修改console下的kernel.php,修改任务执行的频率
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('order')
->everyMinute();
}
6、如何测试任务逻辑是否正确
因为在任务文件中不能按照常规方法进行测试,laravel 提供了方法在终端执行命令:php artisan command:order 这个command:order就是2里面的任务名称,所以2里面怎么定的这个里怎么执行。测试修改完成说明这个任务可以调度了,这里单独说一下,测试完毕一定要Control+c一下退出,要不然进程会一直执行下去,给测试带来没有必要的麻烦。
7、crontab添加定时任务
crontab -l 查已有定时任务列表
crontab -e 添加定时任务
* * * * * php /Users/lf/wwwroot/laravel/artisan command:order >> /dev/null 2>&1
上面五个星星代表:分,时,日,周 后面的就上上面测试时候使用的命令,只不过使用artisan这个命令这里要写绝对路径,因为artisan是这个框架里的命令,另外要说一下php这个命令你在用的时候发现没有执行,那么修改为php的绝对路径,再试一下
8、在整体使用的过程中遇见的问题
说明一下我本地是mac系统,在整套逻辑中,安这个流程走一般是不会出问题的,但是我在最后都测试完毕的时候出现了问题,在cron执行完以后我无法关闭这个cron,我把数据库清空,再把队列加入数据,还会继续往数据库中写入数据直到队列没有数据为止。那么这里问题来了,该如何关闭cron,我在网上查了很多的例子,有的说使用sudo cron stop,有的说杀死程序。这些办法都不能解决。包括我进入crontab 删掉这个任务,依然无法停止,简直就是很神奇。最后我删掉了任务,重启了电脑才最终让它停下来。但是具体为什么不还不的而知,先说一下cron是一个特殊的存在,大概是它是不能停下来的,但是我看网上说linux系统的cron可能停止。,回头我部署到linux系统再试一下,看看如何。