laravel编写后台回写脚本

laravel编写后台回写脚本

不同与队列和任务调度(定时任务),这里我要实现近似实时的后台回写进程。

要求做到平滑重启,使其在完成某一次任务后自动退出进程,而不是暴力kill进程。

先配置好redis

创建一个command
php artisan make:command Read3SuccessStat

注册命令
在kernel.php中的$commands中添加 Read3SuccessStat::class

编辑命令

<?php

namespace App\Console\Commands;


use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;

class Read3SuccessStat extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'Read3SuccessStat {--action=}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '排查成就是否达成';

    private $key;
    private $startTime;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
        $this->key = 'signal:stop_Read3SuccessStat';
        $this->startTime       = time();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $action = $this->option('action');

        if($action == 'run'){
            $this->doStat();
        }elseif ($action == 'stop'){
            $this->sendStopSignal();
        }
    }

    public function doStat(){
        while(true){
        	if ($this->checkIfNeedExit()) {
                break;
            }
            
            $this->info(date('Y-m-d H:i:s'));

            sleep(2);
        }

        $this->info('Read3SuccessStat stoped');
    }

    public function sendStopSignal(){
        Redis::set($this->key, 1);
        $this->info('the stop signal is sended to Read3SuccessStat');
    }
    
	public function checkIfNeedExit()
    {
        $signal = Redis::get($this->key);
        if (!empty($signal) && $signal > $this->startTime) {
            return true;
        }

        return false;
    }
}

打开两个命令行,进入项目根目录,分别执行以下命令

启动
php artisan Read3SuccessStat --action=run

停止
php artisan Read3SuccessStat --action=stop

关于进程重启
使用supervisor来管理 php artisan Read3SuccessStat --action=run 命令,可以做到自动重启,当你发送stop指令后,进程自动退出,然后supervisor会帮你唤起进程。

关于supervisor的使用,可参考其他文章。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页