tp5日志分表
/**
* 记录网站日志
*
* @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日志分表的更多相关文章
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 前言
介绍 大家好我是初久,一名从业4年的.Net开发攻城狮,从今天开始我会和大家一起对企业开发中常用的技术进行分享,一方面督促自己学习,一方面也希望大家可以给我指点出更好的方案,我们一起进步. 项目背景 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 控制反转搭配简单业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 说明 我们上一节已经成功通过 连接提供程序存储库,获取到了 连接提供程序,但是连接提供程序和数据库连接依赖太深, ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统五 | 完善业务自动创建数据库
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 说明 这节来把基础的业务部分完善一下. 因为 IQue ...
- #企业项目实战 .Net Core + Vue/Angular 分库分表日志系统六 | 最终篇-通过AOP自动连接数据库-完成日志业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表
之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统三 | 控制反转搭配简单业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统二 | 简单的分库分表设计
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统一 | 前言
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
随机推荐
- 「快学SpringBoot」配置文件的加载顺序和配置项默认值设置
前言 有的时候,配置信息是我们无法在开发过程中就能确定的.比如,给客户开发的项目,客户需要根据自身的情况自定义配置,如数据库配置,加密密钥配置等等.这时候,就需要把配置文件放在外面,让用户自定义配置部 ...
- springMVC的 Converter转换器 和 Formatter
Converter转换器 spring的Converter是可以将一种类型转换成另一种类型的一个对象, 自定义Converter需要实现Converter接口 日期转换器 import java.te ...
- 02-09Android学习进度报告九
今天我学习了关于Adapter的基础知识,了解了Android开发的一些思路和架构. 首先我了解了Adapter的概念以及开发过程中常用的Adapter: BaseAdapter:抽象类,实际开发中我 ...
- Unity表面着色器
表面着色器和之前无光照着色器不同,其中没有顶点着色器和片元着色器,而增加了光照函数: 接下写了一个求两个贴图的光照效果 两个贴图做插值运算: Shader "Custom/SurfaceSh ...
- MongoDB基础篇1:安装和服务配置
一.下载 请前往官网下载community版本MongoDB,我当前可见最新版本是3.6.4 https://www.mongodb.com/download-center#community 如需下 ...
- LPS(最长回文子序列)
(注意:我发现最长回文子序列(Longest Palindromic Subsequence)问题与最长回文子串(Longest Palindromic Substring)不一样,子序列不要求下标一 ...
- Go语言中的数组与数组切片
Go中的数组与C的数组一样,只是定义方法不同 c: int a[10][10] Go [10][10]int 定义并初始化 array1 := [5]int{1,2,3,4,5} 变量名 := [in ...
- Day1-B-CF-1144B
简述:有一个n个元素的序列,选奇数下一个就选偶数,偶数则下一个就是奇数,问能否取完,能取完输出0,否则输出能剩下的最小的之和 思路:统计奇偶数个数,若相等或相差一则取完,否则排列后取出最小的前x个(x ...
- Python 之网络编程之进程总体概要
一: 进程的概念:(Process) 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位. 资源分配:分配的是cpu和内存等物理资源 进程号是进程的唯一标识 同一个程序执行两次之后是两个进程 ...
- .Net后台实现支付宝APP支付
前面讨论了微信支付,接下来聊聊支付宝的APP支付(新款支付宝支付).其实这些支付原理都一样,只不过具体到每个支付平台,所使用的支付配置参数不同,返回至支付端的下单参数也不同. 话不多说,直接上代码. ...