DevopsTask.php 2.5 KB
<?php

namespace App\Console\Commands;


use App\Models\Devops\DevopsTaskLog;
use App\Models\Project\Project;
use Illuminate\Console\Command;
use App\Models\Devops\DevopsTask as DevopsTaskModel;

/**
 * Class DevopsTask
 * @package App\Console\Commands
 * @author zbj
 * @date 2023/4/25
 */
class DevopsTask extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'devops_task';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '运维任务执行';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * @return bool
     */
    public function handle()
    {
        while (true){
            $tasks = DevopsTaskModel::where('status', DevopsTaskModel::STATUS_PENDING)->get();
            foreach ($tasks as $task){
                echo "Start task " . $task->id . PHP_EOL;
                if($task->type == DevopsTaskModel::TYPE_MYSQL){
                    $this->updateTable($task);
                }
                echo "End task " . $task->id . PHP_EOL;
            }
            sleep(10);
        }
    }

    public function updateTable($task){
        $projects = Project::all();
        foreach ($projects as $project){
            echo "project " . $project->id;
            $log = DevopsTaskLog::addLog($task->id, $project->id);
            if($log->status == DevopsTaskModel::STATUS_ACTIVE){
                continue;
            }
            if(!$project->mysqlConfig){
                $log->status = DevopsTaskLog::STATUS_ERROR;
                $log->remark = '未配置数据库';
                $log->save();
                continue;
            }
            //DB类是单例模式,生命周期内修改配置不会生效
            $conn = new \mysqli(
                $project->mysqlConfig->host,
                $project->mysqlConfig->user,
                $project->mysqlConfig->password,
                $project->databaseName(),
                $project->mysqlConfig->port,
            );
            $res = $conn->query($task->sql);

            $log->status = $res ? DevopsTaskLog::STATUS_ACTIVE : DevopsTaskLog::STATUS_ERROR;
            $log->remark = $res ? '成功' : 'sql执行失败';
            $log->save();
            echo '-->' . $log->remark . PHP_EOL;
        }
        $task->status = DevopsTaskModel::STATUS_ACTIVE;
        $task->save();
    }
}