命令行实战

<?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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352