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