美文网首页
命令行实战

命令行实战

作者: dongdog | 来源:发表于2020-09-06 22:27 被阅读0次
<?php
/**
 * 创建表格
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/9/5
 * Time: 21:50
 */

namespace app\index\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\Output;
use think\Db;

class CreateLogTable extends Command
{


    private $db;
    private $dateYmd;

    /**
     * 配置方法
     */
    protected function configure()
    {
        //给php think CreateTable 注册备注
        $this->setName('CreateLogTable')
            ->setDescription('创建日志表命令')/**
             * 定义形参
             * Argument::REQUIRED = 1; 必选
             * Argument::OPTIONAL = 2;  可选
             */
            ->addArgument('cronTab', Argument::OPTIONAL, '是否是定时任务')
            ->addArgument('start_date', Argument::OPTIONAL, '开始日期:格式2012-12-12')
            ->addArgument('end_date', Argument::OPTIONAL, '结束日期')// 运行 "php think list" 时的简短描述
            ->setDescription('创建表格')// 运行命令时使用 "--help | -h" 选项时的完整命令描述
            ->setHelp("当不给开始结束时间,默认只跑当天;\n只给了开始时间,跑指定的一天;\n给了开始和结束时间,跑指定范围内所有数据;");
    }

    const LOG_LIST = [
        //登陆 和 注册 都是总表 一张
        "tbl_gold_log_"               => [
            'name'      => '金币日志',
            'index_sql' => "KEY `game` (`role_id`,`p3`,`esrc`,`date`),
                KEY `activity` (`role_id`,`esrc`,`ps1`),
                KEY `role_date` (`role_id`,`date`)" //这是索引sql
        ],
        "tbl_exp_log_"                => [
            'name'      => '经验日志',
            'index_sql' => "KEY `role_date` (`role_id`,`date`)" //无索引
        ],
        "tbl_vip_exp_log_"            => [
            'name'      => 'vip经验日志',
            'index_sql' => "KEY `role_date` (`role_id`,`date`)" //无索引
        ],
        "tbl_exp_buff_log_"           => [
            'name'      => '经验buff日志',
            'index_sql' => "KEY `role_date` (`role_id`,`date`)" //无索引
        ],
        "tbl_upgrade_bonus_buff_log_" => [
            'name'      => '等级奖励buff日志',
            'index_sql' => "KEY `role_date` (`role_id`,`date`)" //无索引
        ],
        "tbl_room_log_"               => [
            'name'      => '房间日志',
            'index_sql' => "KEY `role_date` (`role_id`,`date`)" //无索引
        ],
        "tbl_prop_log_"               => [
            'name'      => '道具获得日志',
            'index_sql' => "KEY `role_date` (`role_id`,`date`)" //无索引
        ],
        "tbl_email_log_"              => [
            'name'      => '个人邮件日志',
            'index_sql' => "KEY `role_date` (`role_id`,`date`)" //无索引
        ],
    ];


    /**
     *     * 生成所需的数据表
     * php think test  调用的方法
     *
     * @param Input  $input  接收参数对象
     * @param Output $output 操作命令
     *
     * @return int|null|void
     * @throws \think\Exception
     */
    protected function execute(Input $input, Output $output)
    {
        //数据库连接
        $this->db = Db::connect('database.log');


        //是定时任务
        if (!empty($input->getArgument('cronTab'))) {
            //生成明天的日志
            $this->dateYmd = date('Ymd', strtotime('tomorrow'));
            $output->writeln("---{$this->dateYmd}日定时任务开始---");
            //遍历生成日志
            foreach (self::LOG_LIST as $table => $value) {
                //判断表表不存在
                $exist = $this->db->query("show tables like '{$table}{$this->dateYmd}'");
                if (empty($exist)) {
                    $createTableSql = $this->getCreateLogsSql($table . $this->dateYmd, $value);
                    //生成各种日志表
                    $this->db->execute($createTableSql);
                    $output->writeln("---{$table}{$this->dateYmd}:日志表生成成功---");
                }
            }
            $output->writeln("---本次定时任务结束---");
            exit;
        }
        //获取传输的时间
        $start_date = $input->getArgument('start_date');
        $end_date   = $input->getArgument('end_date');
        if (empty($start_date) || empty($end_date)) {
            $output->writeln("---start_date或者end_date未传入---");
            exit;
        }
        while ($start_date <= $end_date) {
            //循环生成报表
            foreach (self::LOG_LIST as $table => $message) {
                //日志日期充值
                $this->dateYmd = date('Ymd', strtotime($start_date));
                //判断表表不存在
                $exist = $this->db->query("show tables like '{$table}{$this->dateYmd}'");
                //如果不存在
                if (empty($exist)) {
                    $createTableSql = $this->getCreateLogsSql($table . $this->dateYmd, $message, $table);
                    //生成各种日志表
                    $this->db->execute($createTableSql);
                    $output->writeln("---{$table}{$this->dateYmd}日志生成---");
                }
            }
            $start_date = date('Y-m-d', strtotime("+1 day", strtotime($start_date)));
        }
        $output->writeln("---本次定时任务结束---");
    }

    /**
     * 获取各种子报表的sql
     *
     * @param array  $info
     * @param string $tableName
     *
     * @return string
     */
    private function getCreateLogsSql(string $tableName, array $info)
    {
        return "
        CREATE TABLE `{$tableName}` (
          `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
          `date` datetime DEFAULT NULL,
          `sid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '服务器id,为0表示来源未知',
          `roleid`  int(11) unsigned NOT NULL DEFAULT '0' COMMENT '服务器id-角色id,为0表示系统事件 角色id不唯一',
          `eid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '事件id 大分类',
          `esrc` int(11) unsigned DEFAULT '0' COMMENT '事件来源 子分类',
          `p1` bigint(20) DEFAULT '0' COMMENT '参数1',
          `p2` bigint(20) DEFAULT '0' COMMENT '参数2',
          `p3` bigint(20) DEFAULT '0' COMMENT '参数3',
          `p4` bigint(20) unsigned DEFAULT '0' COMMENT '参数4',
          `p5` bigint(20) DEFAULT '0' COMMENT '参数5',
          `p6` bigint(20) DEFAULT '0' COMMENT '参数6',
          `ps1` varchar(1024) DEFAULT NULL COMMENT '字符串参数1',
          `ps2` varchar(1024) DEFAULT NULL COMMENT '字符串参数2',
          `ps3` varchar(1024) DEFAULT NULL COMMENT '字符串参数3',
          PRIMARY KEY (`id`)
          {$info['index_sql']}
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='{$info['name']}';
        ";

    }


}

命令行调用 php 执行think 脚本名 参数1 参数2 参数3

php /www/wwwroot/newCenter/think CreateLogTable 0 2020-09-01 2020-09-06

相关文章

网友评论

      本文标题:命令行实战

      本文链接:https://www.haomeiwen.com/subject/fayhektx.html