<?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
网友评论