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='网站日志'

  • 相关阅读:
    狼文化的一点思考
    数据可视化之风向图
    谈谈JavaScript代码混淆
    比尔盖茨2016好书推荐
    Cesium原理篇:glTF
    个人 产品 团队(下):个人与团队
    技术 产品 团队(上):如何成为超级个体
    惊艳的HTML5动画特效及源码
    精心挑选的HTML5/CSS3应用及源码
    炫酷霸气的HTML5/jQuery应用及源码
  • 原文地址:https://www.cnblogs.com/zouke1220/p/9200484.html
Copyright © 2011-2022 走看看