zoukankan      html  css  js  c++  java
  • 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'] > 0) { foreach ($data as &$v) { if (is_string($v)) { $v = mb_substr($v, 0, 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'] == 0) { // 获取建表语句 $result = Db::query("SHOW CREATE TABLE {$table}"); $sql = array_pop($result[0]); // 获取联合表的所有表名 preg_match('/UNION=(([^)]*)/', $sql, $matches); $tables = explode(',', $matches[1]); // 取到最后一个表名,作为取 id 的依据 $tableLast = end($tables); $tableLast = trim($tableLast, '`'); // 表名都是包含零填充的三位整数 $id = intval(substr($tableLast, -3, 3)); $tableNew = $tablePrefix . self::$config['web_log_table'] . '_' . sprintf('%03d', $id + 1); // 建表并给设置自动递增 id self::createTable($tableNew, $tableLast, $id * intval(self::$config['max_rows']) + 1); // 更新 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 = 1) { // 获取建表语句 $result = Db::query("SHOW CREATE TABLE {$tableOld}"); $sql = array_pop($result[0]); $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(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '日志主键',
      `uid` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
      `ip` char(15) NOT NULL DEFAULT '' COMMENT '访客ip',
      `location` varchar(255) NOT NULL DEFAULT '' COMMENT '访客地址',
      `os` varchar(255) NOT NULL DEFAULT '' COMMENT '操作系统',
      `browser` varchar(255) NOT NULL DEFAULT '' COMMENT '浏览器',
      `url` varchar(255) NOT NULL DEFAULT '' COMMENT 'url',
      `module` varchar(255) NOT NULL DEFAULT '' COMMENT '模块',
      `controller` varchar(255) NOT NULL DEFAULT '' COMMENT '控制器',
      `action` varchar(255) NOT NULL DEFAULT '' COMMENT '方法',
      `method` char(6) NOT NULL DEFAULT '' COMMENT '请求方式',
      `data` text COMMENT '请求的param数据,serialize后的',
      `create_at` int(10) unsigned NOT NULL DEFAULT '0' 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='网站日志'

  • 相关阅读:
    docker as engitor及云构建devops选型
    elmlang:一种编码和可视化调试支持内置的语言系统
    engitor:基于jupyter,一个一体化的语言,IDE及通用分布式架构环境
    【Heritrix基础教程之3】Heritrix的基本架构
    Eclipse 快捷键大全
    【Heritrix基础教程之2】Heritrix基本内容介绍
    【Heritrix基础教程之1】在Eclipse中配置Heritrix
    Berkeley DB基础教程
    【搜索引擎Jediael开发笔记】v0.1完整代码
    【搜索引擎Jediael开发笔记】V0.1完整代码
  • 原文地址:https://www.cnblogs.com/zouke1220/p/9200484.html
Copyright © 2011-2022 走看看