/**
* 记录网站日志
*
* @return bool
*/
public function record()
{
// 组装数据
$log = self::$param;
$log[self::METHOD] = strtoupper($log[self::METHOD]);
$data = self::$data;
// 截取一部分数据,避免数据太大导致存储出错,比如文章发布提交的数据
if (self::$config['max_data_length'] > ) {
foreach ($data as &$v) {
if (is_string($v)) {
$v = mb_substr($v, , self::$config['max_data_length']);
}
}
}
$log[self::DATA] = serialize($data); // 写入日志
$tablePrefix = null === self::$config['table_prefix'] ? Config::get('database.prefix') : self::$config['table_prefix'];
$table = $tablePrefix . self::$config['web_log_table'] . '_all';
$logId = Db::table($table)->insertGetId($log); // 自动分表
if ($logId % self::$config['max_rows'] == ) {
// 获取建表语句
$result = Db::query("SHOW CREATE TABLE {$table}");
$sql = array_pop($result[]);
// 获取联合表的所有表名
preg_match('/UNION=\(([^\)]*)/', $sql, $matches);
$tables = explode(',', $matches[]);
// 取到最后一个表名,作为取 id 的依据
$tableLast = end($tables);
$tableLast = trim($tableLast, '`');
// 表名都是包含零填充的三位整数
$id = intval(substr($tableLast, -, ));
$tableNew = $tablePrefix . self::$config['web_log_table'] . '_' . sprintf('%03d', $id + );
// 建表并给设置自动递增 id
self::createTable($tableNew, $tableLast, $id * intval(self::$config['max_rows']) + );
// 更新 merge 表的 union 信息
array_push($tables, $tableNew);
Db::execute("ALTER TABLE {$table} UNION = (" . implode(',', $tables) . ")");
} return true;
} /**
* 创建日志分表
*
* @param string $tableNew 新表表名
* @param string $tableOld 参照表表名
* @param int $autoIncrement 自增id
*
* @return int
*/
private function createTable($tableNew, $tableOld, $autoIncrement = )
{
// 获取建表语句
$result = Db::query("SHOW CREATE TABLE {$tableOld}");
$sql = array_pop($result[]);
$sql = preg_replace(
['/CREATE TABLE `(\w+)`/', '/AUTO_INCREMENT=(\d+)/'],
["CREATE TABLE `{$tableNew}`", "AUTO_INCREMENT={$autoIncrement}"],
$sql
); return Db::execute($sql);
}

SHOW CREATE TABLE tp_web_log_all

CREATE TABLE `tp_web_log_all` (
`id` int() unsigned NOT NULL AUTO_INCREMENT COMMENT '日志主键',
`uid` smallint() unsigned NOT NULL DEFAULT '' COMMENT '用户id',
`ip` char() NOT NULL DEFAULT '' COMMENT '访客ip',
`location` varchar() NOT NULL DEFAULT '' COMMENT '访客地址',
`os` varchar() NOT NULL DEFAULT '' COMMENT '操作系统',
`browser` varchar() NOT NULL DEFAULT '' COMMENT '浏览器',
`url` varchar() NOT NULL DEFAULT '' COMMENT 'url',
`module` varchar() NOT NULL DEFAULT '' COMMENT '模块',
`controller` varchar() NOT NULL DEFAULT '' COMMENT '控制器',
`action` varchar() NOT NULL DEFAULT '' COMMENT '方法',
`method` char() NOT NULL DEFAULT '' COMMENT '请求方式',
`data` text COMMENT '请求的param数据,serialize后的',
`create_at` int() unsigned NOT NULL DEFAULT '' COMMENT '操作时间',
PRIMARY KEY (`id`),
KEY `uid` (`uid`) USING BTREE,
KEY `ip` (`ip`) USING BTREE,
KEY `create_at` (`create_at`) USING BTREE
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC INSERT_METHOD=LAST UNION=(`tp_web_log_001`) COMMENT='网站日志'

tp5日志分表的更多相关文章

  1. 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】

    一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...

  2. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 前言

    介绍 大家好我是初久,一名从业4年的.Net开发攻城狮,从今天开始我会和大家一起对企业开发中常用的技术进行分享,一方面督促自己学习,一方面也希望大家可以给我指点出更好的方案,我们一起进步. 项目背景 ...

  3. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 控制反转搭配简单业务

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 说明 我们上一节已经成功通过 连接提供程序存储库,获取到了 连接提供程序,但是连接提供程序和数据库连接依赖太深, ...

  4. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统五 | 完善业务自动创建数据库

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 说明 这节来把基础的业务部分完善一下. 因为 IQue ...

  5. #企业项目实战 .Net Core + Vue/Angular 分库分表日志系统六 | 最终篇-通过AOP自动连接数据库-完成日志业务

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  6. mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  7. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统三 | 控制反转搭配简单业务

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  8. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

  9. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统一 | 前言

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...

随机推荐

  1. selenium webdriver 操作RadioButton

    @Test public void testRadio() { WebDriver driver = ExplorerBase.IESetting(); try { Thread.sleep(500) ...

  2. 用Jackson进行Json序列化时的常用注解

    Jackson时spring boot默认使用的json格式化的包,它的几个常用注解: @JsonIgnore 用在属性上面,在序列化和反序列化时都自动忽略掉该属性 @JsonProperty(&qu ...

  3. Vue中 关于 ‘...mapGetters’的了解

    首先,我们应该知道getters是vuex中的特殊表达部分 不使用map辅助函数: computed: { test:()=> this.$store.getters.doSome } 使用ma ...

  4. idea 添加 阿里代码规范

    参考: https://blog.csdn.net/weixin_39220472/article/details/80077803

  5. AI基础概念

    基础概念 epoch:使用训练的全部数据对模型进行一次完整的训练,被成为“一代训练”.当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一次epoch.(也就是说,所有训练样本在神经网络 ...

  6. 解题报告:luogu P5745 【深基附B例】数列求和

    题目链接:P5745 [深基附B例]数列求和 现在想说:\(O(N)\)的题要不怎么也想不出来,要不灵光乍现,就像这道题. 我们维护一个类似单调队列的加法单调队列: 若相加大于此数,就将队尾元素弹出, ...

  7. 学习Flutter应用开发有用的代码/库/专有技术列表

    当我开始使用Flutter开发该应用程序时,我开始担心:“最好的书写方式是什么?”以及“放置它的效果如何?”在这种情况下,您将需要学习和参考GitHub发布的代码和应用程​​序. 因此,我收集了似乎对 ...

  8. Python查询Redis中的Key

    今日,大哥让我查下项目的在线用户量,听到这个消息顿时懵逼了,在线用户量,这个该怎么查????想到项目中的登陆用户缓存信息Token都存放在Redis中,是不是可以根据Redis中Token的个数大致估 ...

  9. PHP开发者该知道的5个Composer小技巧

    Composer 是新一代的PHP依赖管理工具.本文介绍使用Composer的五个小技巧,希望能给你的PHP开发带来方便. 1. 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单 co ...

  10. C 常用库函数memset,编译器宏定义assert

    一. 总览 1.1库函数 函数名 头文件 功能 原型 说明 syslog syslog.h 记录至系统记录(日志) void    syslog(int, const char *, ...) __p ...