zouke1220
    /**
     * 记录网站日志
     *
     * @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=\'网站日志\'

 

分类:

技术点:

相关文章:

  • 2021-05-08
  • 2021-12-22
  • 2021-12-22
  • 2021-07-25
猜你喜欢
  • 2021-04-12
  • 2021-03-26
  • 2021-12-12
  • 2021-08-21
  • 2021-10-04
  • 2021-10-09
相关资源
相似解决方案