/**
* 记录网站日志
*
* @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. spring security几大核心组件

    一.SecurityContext 安全上下文,用户通过Spring Security 的校验之后,验证信息存储在SecurityContext中 SecurityContext接口只定义了两个方法, ...

  2. 模块学习-time,datetime模块

    1 time.timezone #以秒为单位显示时区 >>> import time >>> time.timezone -28800 北京为东八区,所以为-288 ...

  3. ApacheDbUtilsUpdate

    ApacheDbUtilsUpdate package p1; import com.DataSourceUtil; import org.apache.commons.dbutils.QueryRu ...

  4. CentOS7中下载安装Multitail(让你的日志文件变得多彩)

    MultiTail是干啥的? Linux系统下查看日志的一个工具,允许您监视终端中多个窗口中的日志文件和命令输出,着色,过滤和合并. 具体介绍请看官网:https://www.vanheusden.c ...

  5. Java - 使用hibernate配置文件 + JPA annotation注解操作数据库

    本程序运行环境:IDEA. 实际上我对hiberbate与注解的关系还不是太清晰.据我所知注解都是Java JPA的,那么我的理解是:hibernate就应该只是通过这些JPA标识及hibernate ...

  6. apply()、call()、bind()

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向.apply和call方法.bind方法都是在特定的作用域中 ...

  7. Python 基础之循环结构 while

    一.while循环介绍 while 循环 可以提高代码的效率,减少代码的冗余 while 条件表达式:    code1    code2如果条件表达式成立,返回Ture,就执行其中的代码块 1.基本 ...

  8. Kali aircrack-ng wifi密码破解(暴力)

    1.kali linux安全渗透 2.工具aircrack-ng 3.ifconfig查看你的网卡信息,wlan0即无线网卡,注意,如果没有发现网卡可能是芯片不能被识别,建议选择网卡芯片为3037或r ...

  9. BigDecimal类用于计算(不会丢失精度)

  10. python如何画三维图像?

    python三维图像输出的代码如下所示:#画3D函数图像输出from mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmimport ...