DevopsTask.php 2.8 KB
<?php

namespace App\Console\Commands;


use App\Models\Devops\DevopsTaskLog;
use App\Models\Project\Project;
use App\Utils\EncryptUtils;
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()
    {
        $tasks = DevopsTaskModel::where('status', DevopsTaskModel::STATUS_PENDING)->get();
        foreach ($tasks as $task){
            echo "Start task " . $task->id;
            if($task->type == DevopsTaskModel::TYPE_MYSQL){
                $this->updateTable($task);
            }
            echo "End task " . $task->id . PHP_EOL;
        }
    }

    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){
                echo  'continue' . PHP_EOL;
                continue;
            }
            if(!$project->mysqlConfig){
                $log->status = DevopsTaskLog::STATUS_ERROR;
                $log->remark = '未配置数据库';
                $log->save();
                continue;
            }
            //DB类是单例模式,生命周期内修改配置不会生效
            try {
                $conn = new \mysqli(
                    $project->mysqlConfig->host,
                    $project->mysqlConfig->user,
                    $project->mysqlConfig->password,
                    $project->databaseName(),
                    $project->mysqlConfig->port,
                );
            }catch (\Exception $e){
                $log->remark = mb_substr('数据库连接失败:' . $e->getMessage(), 0, 500);
                $log->status = DevopsTaskLog::STATUS_ERROR;
                $log->save();
                echo '-->' . $log->remark . PHP_EOL;
                continue;
            }
            $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();
    }
}