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的使用,可参考其他文章。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务