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

原文地址:https://www.cnblogs.com/zouke1220/p/9200484.html