/**
* 记录网站日志
*
* @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. jdk 档案库(包含历史版本)

    http://java.sun.com/products/archive/ 参考:https://blog.csdn.net/shiluyong8068/article/details/7894747 ...

  2. Vue - 动态绑定class

    <div :class="{active:item.index==1}" >  </div>

  3. springboot#下载文件

    膜拜大神 这就是我要的滑板鞋! @RequestMapping(value = "/media", method = RequestMethod.GET) public Respo ...

  4. 37 java序列化与反序列化

    一.java序列化与反序列化 1.序列化: 是指把java对象转换为字节序列的过程: 2.反序列化:是指把字节序列恢复为java对象的过程. 二.为什么要序列化 我们知道,当两个进程进行远程通信时,可 ...

  5. List模拟栈

    import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class Main<E ...

  6. Day11 - H - Euclid's Game HDU - 1525

    Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtra ...

  7. 日常使用SqlServer的笔记

    表操作 查表大小 sp_spaceused 表名 修改表名 ALTER TABLE table RENAME TO NEW_TABLE_NAME; 修改列名 不支持 ALTER TABLE table ...

  8. Django 学习之From组件

    一.Form组件介绍 Form组件可以做的几件事情: 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交的正确信息 4.如果其中有一个错误了,其他的正确这,保留上次输入的内容 4.自动创建i ...

  9. day06 python 3中的编码

    #python2 和 python3 的一些区别 ''' #python2 print('aaa') print'aaa' range() xrange()生成器 raw_input() #pytho ...

  10. java 获取(格式化)日期格式

    // 参考: https://www.cnblogs.com/blog5277/p/6407463.htmlpublic class DateTest { // 支持时分秒 private stati ...