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自动连接数据库-完成日志业 ...
随机推荐
- win10的guard占内存过高
转自:https://zhidao.baidu.com/question/1180883495203481459.html win10的guard占内存过高,
- 解决EFCore缓存机制导致的数据查询错误问题
如题,在对同一个Context连续进行相同条件的查询时,会触发EFCore的缓存机制,如果这个过程中数据发生了变化,则会出现错误. 例如:有两个Context实例,一个负责查询,一个负责增删改, A_ ...
- JavaScript学习笔记----- 继承的实现及其原理
按照自己在极客上学习的顺序整理了一下,参考了几位前辈的随笔,十分感谢: 参见http://blog.yemou.net/article/query/info ...
- 删除hdfs上的内容报错:rm: Cannot delete /wxcm/ Name node is in safe mode.
问题:在执行删除hdfs上的内容时(hdfs dfs -rm -f -r -skipTrash /wxcm)报错:rm: Cannot delete /wxcm/ Name node is in sa ...
- 使用jquery select2实现下拉框搜索功能
由于公司后台系统下拉框数据量太多了,用户操作起来要不方便所以增加了下拉框里面一个搜索功能 1从官网下载jquery select2 下来 地址https://select2.github.io/ 2: ...
- MyuCMS_V2.1漏洞分析
前言 在CNVD看到一个MyuCMS的一个任意文件删除漏洞.然后去搜了下这个CMS,发现官网公告显示在V2.2.3版本修复了CNVD提供的多处漏洞. 怀着好奇的心里,去CNVD搜了下这个CMS,结果发 ...
- java连接sql server 2008
请先确保已经设置好了sa,如果不是,可以参照下面链接修改http://jingyan.baidu.com/article/8cdccae9452b3c315513cd52.html 然后重启数据库,重 ...
- ASP.NET MVC4 Web项目中使用Log4Net记录日志到文件和数据库。
下载与.netframework版本向对应的log4net.dll ,然后添加引用.下载地址:http://logging.apache.org/log4net/download_log4net.cg ...
- C. Book Reading 求在[1,n]中的数中,能整除m的数 的个位的和
C. Book Reading time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- PHP 获取一周的时间
$date = array( 'Monday' => array(date('Y-m-d H:i:s',strtotime("Monday")),date('Y-m-d H: ...