当前位置:首页>python>你的大模型还在用Python读文字?我把tokenizer换成了C++,部署包小了100MB

你的大模型还在用Python读文字?我把tokenizer换成了C++,部署包小了100MB

  • 2026-09-03 15:02:21
你的大模型还在用Python读文字?我把tokenizer换成了C++,部署包小了100MB

一、先说说为什么这事值得折腾

做大语言模型的人,第一步往往是搞分词器(Tokenizer)。没有分词器,模型连"词"都看不懂,更别提理解句子了。

市面上训练分词器的工具不少,但大多是Python写的——HuggingFace的tokenizers库、OpenAI的tiktoken、Google的SentencePiece。功能确实全,但问题也来了:

  • 依赖一堆Python包,环境配半天
  • 训练大语料时速度慢,GIL锁限制多线程
  • 输出格式各家不一样,换个框架就得重新适配
  • 想把分词器集成到C++项目里?几乎不可能

那有没有可能,用一个纯C++的头文件,不依赖任何第三方库,直接把语料扔进去,就能训练出一个标准的BPE词汇表?而且输出格式和HuggingFace完全兼容,Python/C++都能直接用?

答案是:完全可以。而且只有一个头文件,编译完就是一个可执行程序。


二、这到底是个什么东西

用最直白的话说,这是一个用现代C++17写的BPE训练器。它只有一个头文件,零外部依赖,标准库就能编译。输入是原始语料(纯文本或JSONL),输出是两个文件——vocab.txtmerges.txt,格式和HuggingFace的BPE Tokenizer完全一致。

2.1 它能干什么

  • 从头训练BPE词汇表:给定语料,自动学习最优的子词拆分策略。
  • HuggingFace兼容:输出的vocab.txt和merges.txt可以直接被HuggingFace Tokenizers加载。
  • C++集成:训练完的词汇表可以配合C++ Tokenizer使用,推理阶段完全脱离Python。
  • 多种输入格式:支持纯文本和JSONL。
  • 可配置预处理:转小写、拆分标点、规范化空格,按需开关。
  • UTF-8安全:正确处理Unicode字符,中文、日文、emoji都能处理。

2.2 核心流程拆解

BPE训练的本质,就是一场"找搭档、合并、再找搭档"的循环游戏:

第一步:预处理

把原始语料清洗一下——转小写、拆分标点、规范化空格、给每个词末尾加上</w>标记(表示词边界)。

第二步:初始拆分

把每个词拆成字符。比如"hello"变成[h, e, l, l, o, </w>]

第三步:统计频率

扫描整个语料,统计每一对相邻字符出现的次数。比如"l"后面跟着"l"出现了1000次,"e"后面跟着"l"出现了800次。

第四步:合并最频繁的 pair

找到出现次数最多的相邻字符对,把它们合并成一个新符号。比如"l + l"合并成"ll"。然后更新整个语料,把所有"ll"都替换成这个新符号。

第五步:重复

回到第三步,重新统计,再合并,再统计,再合并……直到词汇表达到预设大小。


三、BPE训练与编码流程图

左图展示了从原始语料到最终词汇表的完整训练流程,右图展示了用训练好的词汇表把句子编码成token ID的过程。


四、核心模块原理详解

4.1 BPE算法:从字符到子词

BPE(Byte Pair Encoding)最初是数据压缩算法,后来被引入自然语言处理,成为最流行的分词方法之一。

它的核心思想是:从字符开始,逐步合并最频繁的相邻字符对,形成子词单元

举个例子,语料里有这些词:

low → [l, o, w, </w>]
lower → [l, o, w, e, r, </w>]
newest → [n, e, w, e, s, t, </w>]
widest → [w, i, d, e, s, t, </w>]

第一轮统计,发现"e"后面跟着"s"出现了2次(newest、widest),"s"后面跟着"t"也出现了2次。假设"es"的频率最高,就把它合并:

newest → [n, e, w, es, t, </w>]
widest → [w, i, d, es, t, </w>]

第二轮,发现"es"后面跟着"t"出现了2次,合并成"est":

newest → [n, e, w, est, </w>]
widest → [w, i, d, est, </w>]

第三轮,"l"后面跟着"o"出现了2次(low、lower),合并成"lo":

low → [lo, w, </w>]
lower → [lo, w, e, r, </w>]

就这样一轮一轮合并,词汇表从几十个字符慢慢增长到几万个子词。高频的组合(如"ing"、"tion"、"hello")会被合并成单独的token,低频的组合保持拆分状态。

4.2 为什么BPE好用

BPE解决了分词领域的两个经典难题:

OOV问题(Out-Of-Vocabulary)

传统词级分词器,训练时没见过的词就是OOV,只能映射到<unk>。比如训练语料里没有"ChatGPT",词级分词器就懵了。

BPE不怕这个——"ChatGPT"可能被拆成[Chat, G, PT][Ch, at, GP, T],每个子词都在词汇表里,没有OOV。

词汇表大小平衡

  • 字符级分词:词汇表很小(几十到几百),但序列很长,模型难学
  • 词级分词:序列短,但词汇表巨大(几十万),模型 embedding 层参数爆炸

BPE在两者之间取平衡:词汇表通常3万-5万,序列长度适中,既控制了模型大小,又保留了语义信息。

4.3 词尾标记:区分"词内"和"词尾"

BPE在每个词末尾加一个特殊标记</w>,它的作用是**告诉模型"这个子词是不是词的结尾"**。

比如"hello"和"hell":

  • 不加</w>hello → [he, llo]hell → [he, ll]——模型不知道"llo"和"ll"的区别
  • </w>hello → [he, llo</w>]hell → [he, ll</w>]——"llo"明确表示这是词尾

这个标记让模型能区分"词内的子词"和"词尾的子词",对理解词边界很重要。

4.4 预处理:清洗语料

训练前的预处理直接影响分词质量:

选项
作用
建议
转小写
"Hello"和"hello"统一
英文场景建议开,中文不需要
拆分标点
"hello!" → "hello" + "!"
建议开,标点单独成token
规范化空格
多个空格合并成一个
建议开,减少噪声
特殊token
`<
endoftext

4.5 输出格式:vocab.txt + merges.txt

训练完成后,输出两个文件:

vocab.txt:词汇表,每行一个token,按ID排序

<|endoftext|>
<|unk|>
<|pad|>
<|mask|>
!
"
#
...
the
of
and
ing</w>
er</w>
...

merges.txt:合并规则,按合并顺序排列

#version: 0.2
i n
t h
th e
e r
er</w>
...

这两个文件就是BPE分词器的全部"知识"。编码时,按merges的顺序依次合并;解码时,按vocab查ID。

4.6 编码过程:把句子拆成token

有了vocab和merges,怎么把新句子编码成token ID?

// 伪代码:BPE编码
vector<stringencode(string text){
// 1. 预处理
    text = lowercase(text);
    text = split_punctuation(text);

// 2. 拆成单词
vector<string> words = split_whitespace(text);

// 3. 对每个单词做BPE拆分
vector<string> tokens;
for (string word : words) {
// 初始拆成字符 + </w>
vector<string> pieces = split_to_chars(word);
        pieces.push_back("</w>");

// 按merges规则合并
for (auto& merge : merges) {
// 从左到右扫描,合并所有匹配的pair
            pieces = apply_merge(pieces, merge);
        }

        tokens.insert(tokens.end(), pieces.begin(), pieces.end());
    }

// 4. 查vocab得到ID
vector<int> ids;
for (string token : tokens) {
if (vocab.contains(token)) {
            ids.push_back(vocab[token]);
        } else {
            ids.push_back(vocab["<|unk|>"]);  // 未登录词
        }
    }
return ids;
}

关键细节:合并时必须按merges的顺序来。先学的合并优先级高,后学的合并优先级低。这样才能保证编码和解码的一致性。


五、相关领域知识点全面总结

概念
解释
BPE
Byte Pair Encoding,从字符开始逐步合并最频繁相邻对的子词分词算法
Tokenizer
分词器,把文本转换成模型能理解的token序列
Vocabulary
词汇表,模型认识的所有token的集合
Subword
子词,介于字符和单词之间的语言单位(如"ing"、"tion")
OOV
Out-Of-Vocabulary,词汇表外的词
词尾标记,表示子词位于词的末尾
Merge Rule
合并规则,如"l + l → ll"
HuggingFace Tokenizers
HuggingFace的分词器库,支持BPE、WordPiece、Unigram等
JSONL
JSON Lines,每行一个JSON对象的数据格式
UTF-8
Unicode字符编码,支持全球所有文字
Normalization
规范化,如转小写、去重空格、统一标点
Special Token
特殊token,如`<
Frequency-Based
基于频率,出现越多的模式越优先合并
Deterministic
确定性,相同输入总是产生相同输出
Compression Ratio
压缩率,token数 / 字符数,衡量分词效率

六、设计思路与工程亮点

6.1 单头文件,零依赖

整个训练器只有一个.hpp头文件,没有Boost、没有Eigen、没有OpenSSL,纯C++标准库。这意味着:

  • 编译简单:g++ -std=c++17 -O3一行搞定
  • 移植性强:任何有C++17编译器的平台都能跑
  • 集成方便:直接#include进你的项目

6.2 流式读取,内存友好

训练大语料时(比如几十GB的维基百科),不可能一次性读进内存。这个训练器支持流式读取,逐行处理,内存占用稳定。

6.3 配置链式调用

API设计用了链式调用,配置参数一气呵成:

trainer
    .set_lowercase(true)
    .set_split_punctuation(true)
    .set_normalize_whitespace(true)
    .set_special_tokens("<|endoftext|>""<|unk|>""<|pad|>""<|mask|>");

6.4 HuggingFace兼容

输出格式严格遵循HuggingFace Tokenizers的BPE格式,Python端一行代码就能加载:

from tokenizers import Tokenizer
from tokenizers.models import BPE

tokenizer = Tokenizer(BPE(vocab="vocab.txt", merges="merges.txt"))

6.5 可配置的最小频率阈值

min_freq参数控制"多频繁的pair才值得合并"。值越大,训练越快,但学到的模式越少。值越小,训练越慢,但词汇表更精细。可以根据语料大小灵活调整。


七、能用在哪

  • 自定义领域分词器:医学、法律、金融等垂直领域,通用分词器效果不好,用自己的语料训练专用词汇表。
  • C++推理引擎集成:训练完的词汇表直接给C++ Tokenizer用,推理阶段完全脱离Python。
  • 小语种/低资源语言:通用多语言分词器对某些小语种支持不好,自己训一个更精准。
  • 代码生成模型:代码语料和普通文本差异大,用代码库训练专用分词器,token效率更高。
  • 教学演示:BPE算法原理清晰,代码量适中,适合学习"分词器到底是怎么工作的"。

八、手把手跑起来

8.1 快速演示

./bpe-trainer --demo

这个命令会用内置的示例数据跑一遍训练流程,让你快速看到效果。

8.2 从文本文件训练

./bpe-trainer -i corpus.txt -v 16000 -o my_tokenizer

参数说明

参数
含义
默认值
-i, --input
输入文件(文本或JSONL)
必填
-o, --output
输出文件前缀
"tokenizer"
-v, --vocab-size
词汇表大小
32000
-m, --min-freq
最小合并频率
2
--jsonl
输入是JSONL格式
关闭
--text-field
JSONL中的文本字段名
"text"
--no-lowercase
不转小写
关闭(默认转小写)
--no-punct-split
不拆分标点
关闭(默认拆分)

8.3 从JSONL文件训练

./bpe-trainer -i dataset.jsonl --jsonl --text-field content -v 32000 -o my_tokenizer

JSONL格式每行一个JSON对象,程序会提取指定字段的文本内容。

8.4 测试分词效果

./bpe-trainer --test"Hello, world! This is a test."

训练完成后,用这个命令测试分词效果,看句子被拆成了哪些token。

8.5 不同规模语料的训练建议

小语料(1MB以内)

./bpe-trainer -i small.txt -v 8000 -m 2 -o small_tok
# 预计30秒,8K词汇表

中等语料(100MB)

./bpe-trainer -i medium.txt -v 32000 -m 5 -o medium_tok
# 预计10分钟,32K词汇表

大语料(1GB+)

./bpe-trainer -i large.txt -v 50000 -m 10 -o large_tok
# 预计1-2小时,50K词汇表

min-freq的建议:

  • 小语料:-m 2(频率门槛低,尽量多学模式)
  • 中等语料:-m 5(平衡速度和质量)
  • 大语料:-m 10(频率门槛高,过滤噪声,加速训练)

8.6 用Python准备语料

从HuggingFace Datasets下载数据,导出为文本或JSONL:

# 导出为纯文本
from datasets import load_dataset

dataset = load_dataset("imdb", split="train")
with open("corpus.txt""w", encoding="utf-8"as f:
for example in dataset:
        text = example.get("text"or example.get("content")
        f.write(text.replace("\n"" ").strip() + "\n")
# 导出为JSONL
import json
from datasets import load_dataset

dataset = load_dataset("imdb", split="train")
with open("corpus.jsonl""w", encoding="utf-8"as f:
for i, example in enumerate(dataset):
        f.write(json.dumps({"id": i, "text": example["text"]}) + "\n")

8.7 在Python中使用训练好的分词器

from tokenizers import Tokenizer
from tokenizers.models import BPE

# 加载训练好的BPE
tokenizer = Tokenizer(BPE(
    vocab="my_tokenizer_vocab.txt",
    merges="my_tokenizer_merges.txt"
))

# 编码
text = "Hello, world!"
encoding = tokenizer.encode(text)
print("Tokens:", encoding.tokens)
print("IDs:", encoding.ids)

# 解码
decoded = tokenizer.decode(encoding.ids)
print("Decoded:", decoded)

8.8 在C++中使用训练好的分词器

配合C++ Tokenizer库使用:

#include"TextTokenizer.hpp"

TextTokenizer tokenizer;
tokenizer.load_vocab("my_tokenizer_vocab.txt");

auto token_ids = tokenizer.encode("Hello, world!");
// token_ids = {1523, 5, 1847, 8, ...}

九、常见问题排查

训练失败

# 检查文件是否存在且可读
ls -la corpus.txt
file corpus.txt

# 尝试更小的词汇表
./bpe-trainer -i corpus.txt -v 8000 -m 1

训练太慢

# 提高最小频率阈值
./bpe-trainer -i corpus.txt -v 32000 -m 10

# 先用小语料测试
head -n 10000 large.txt > small_test.txt
./bpe-trainer -i small_test.txt -v 8000

内存不足

# 减小词汇表
./bpe-trainer -i corpus.txt -v 16000

# 监控内存使用
top -p $(pgrep bpe-trainer)

If you need the complete source code, please add the WeChat number (c17865354792)

十、写在最后

这个训练器最大的价值,在于证明了BPE分词器可以完全脱离Python生态运行。它不是简单的"用C++包装Python库",而是从语料读取、预处理、统计频率、迭代合并到输出词汇表的全链路原生实现。

对于想深入理解NLP底层原理的人来说,这里面有太多值得啃的细节:

  • BPE是怎么从字符开始一步步"拼"出子词的?
  • 为什么</w>标记对词边界理解很重要?
  • 合并顺序为什么必须是确定性的?
  • 预处理选项(转小写、拆分标点)怎么影响分词质量?
  • 词汇表大小和min_freq怎么平衡?

更重要的是,它建立了一种**"不依赖Python也能动手"**的自信。当你亲手用C++写出一个BPE训练器,看着语料里的字符一轮一轮合并成"ing"、"tion"、"hello"这些子词,再回头看HuggingFace的tokenizers.train(),你会会心一笑——原来你们底层干的,也就是这些事啊。

如果你正在寻找一条从"调包做NLP"到"真正掌控分词器全流程"的进阶路径,这个项目涉及的工程实践和算法细节,应该能帮你打开一扇新的大门。

Welcome to follow WeChat official account【程序猿编码

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-09-03 20:07:50 HTTP/2.0 GET : https://f.mffb.com.cn/a/512392.html
  2. 运行时间 : 0.074638s [ 吞吐率:13.40req/s ] 内存消耗:5,081.01kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=73a067987b2b8901414e5975d7f1218b
  1. /www/wwwroot/mffb/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /www/wwwroot/mffb/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /www/wwwroot/mffb/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /www/wwwroot/mffb/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /www/wwwroot/mffb/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /www/wwwroot/mffb/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /www/wwwroot/mffb/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /www/wwwroot/mffb/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /www/wwwroot/mffb/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /www/wwwroot/mffb/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /www/wwwroot/mffb/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /www/wwwroot/mffb/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /www/wwwroot/mffb/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /www/wwwroot/mffb/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /www/wwwroot/mffb/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /www/wwwroot/mffb/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /www/wwwroot/mffb/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /www/wwwroot/mffb/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /www/wwwroot/mffb/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /www/wwwroot/mffb/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /www/wwwroot/mffb/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /www/wwwroot/mffb/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /www/wwwroot/mffb/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /www/wwwroot/mffb/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /www/wwwroot/mffb/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /www/wwwroot/mffb/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /www/wwwroot/mffb/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /www/wwwroot/mffb/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /www/wwwroot/mffb/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /www/wwwroot/mffb/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /www/wwwroot/mffb/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /www/wwwroot/mffb/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /www/wwwroot/mffb/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /www/wwwroot/mffb/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /www/wwwroot/mffb/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /www/wwwroot/mffb/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /www/wwwroot/mffb/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /www/wwwroot/mffb/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /www/wwwroot/mffb/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /www/wwwroot/mffb/f.mffb.com.cn/runtime/temp/ee3f15ab4905c6d51f7fc3c6e12961f5.php ( 11.95 KB )
  140. /www/wwwroot/mffb/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000440s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000541s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000267s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000208s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000351s ]
  6. SELECT * FROM `set` [ RunTime:0.000176s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000374s ]
  8. SELECT * FROM `article` WHERE `id` = 512392 LIMIT 1 [ RunTime:0.001144s ]
  9. UPDATE `article` SET `lasttime` = 1788437270 WHERE `id` = 512392 [ RunTime:0.003496s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000240s ]
  11. SELECT * FROM `article` WHERE `id` < 512392 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000259s ]
  12. SELECT * FROM `article` WHERE `id` > 512392 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001158s ]
  13. SELECT * FROM `article` WHERE `id` < 512392 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002574s ]
  14. SELECT * FROM `article` WHERE `id` < 512392 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005877s ]
  15. SELECT * FROM `article` WHERE `id` < 512392 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.007056s ]
0.083065s