乐于分享
好东西不私藏

《Nano-vLLM 源码解读》第 11 篇 · ModelRunner:从 prompt 到 token

《Nano-vLLM 源码解读》第 11 篇 · ModelRunner:从 prompt 到 token

nano-vllm 用千行代码拆解 vLLM 核心,是读懂大模型推理最快的捷径。

1. 介绍

调度器决定“这一步跑哪些 Sequence”,Context 负责把元数据透传到模型每一层。但还有一层缺口:模型的 forward 只认张量(input_idspositions),不认 Sequence 对象,也不认 block 表。需要一个把请求翻译成张量、再把结果翻译回 token 的中间层。

这个中间层就是本篇要介绍的 ModelRunner。

2. 本节总览

ModelRunner 接收一批来自调度器的 Sequence,调用模型的 forward 方法,产出 token。

方法
作用
所在篇幅
run
主干:prepare → forward → sample
✅ 本篇
prepare_prefill
变长 prompt 铺成张量
✅ 本篇
prepare_decode
decode step 铺张量
→ 下一篇
allocate_kv_cache
显存预算反推块数
→ L6
set_context
透传元数据
→ L10
run_model
 的 graph 分支
CUDA Graph 提速
后续讲解
loop
/read_shm/write_shm
多进程协作
后续讲解

3. 实现简版 ModelRunner

__init__:初始化

  • • 加载模型权重到 GPU
  • • 创建采样器
  • • 申请 KV Cache
import torchfrom nanovllm.config import Configfrom nanovllm.engine.sequence importSequencefrom nanovllm.models.qwen3 import Qwen3ForCausalLMfrom nanovllm.layers.sampler import Samplerfrom nanovllm.utils.context import set_context, get_context, reset_contextfrom nanovllm.utils.loader import load_modelclassModelRunner:def__init__(self, config: Config):self.config = configself.block_size = config.kvcache_block_sizeSequence.block_size = self.block_size# 确保模型、KV Cache 都加载到 GPU 里,并使用正确的精度        default_dtype = torch.get_default_dtype()        torch.set_default_dtype(config.hf_config.dtype)        torch.set_default_device("cuda")# Qwen3 模型架构,后续章节详细介绍self.model = Qwen3ForCausalLM(config.hf_config)         load_model(self.model, config.model)self.sampler = Sampler()# 下文介绍self.allocate_kv_cache(num_blocks=8)# 还原默认 device/dtype,否则 prepare_* 里# torch.tensor(..., pin_memory=True) 会因默认 cuda 而报错        torch.set_default_device("cpu")        torch.set_default_dtype(default_dtype)

allocate_kv_cache:创建 KV cache

申请一个 6 维张量存储 KV,形状为 (2, num_layers, num_blocks, block_size, num_kv_heads, head_dim)

张量维度的顺序并不是简单拍板,而是针对 KV 读写的特点精心编排的。

以 num_kv_heads 和 head_dim 维度顺序为例:

张量底层是一维连续内存,维度越靠内越相邻,一起读写的数据就越连续,越能避免跨步访问带来的 cache miss 与带宽浪费。

defallocate_kv_cache(self, num_blocks: int):    hf = self.config.hf_config    nkv = hf.num_key_value_heads    head_dim = getattr(        hf, "head_dim", hf.hidden_size // hf.num_attention_heads,    )# 形状 (2, num_layers, num_blocks, block_size, num_kv_heads, head_dim)self.kv_cache = torch.empty(2, hf.num_hidden_layers, num_blocks,self.block_size, nkv, head_dim,    )# 把每层 attention 的 k_cache / v_cache 指到这块大张量的对应切片    layer_id = 0for module inself.model.modules():ifhasattr(module, "k_cache"andhasattr(module, "v_cache"):            module.k_cache = self.kv_cache[0, layer_id]            module.v_cache = self.kv_cache[1, layer_id]            layer_id += 1ModelRunner.allocate_kv_cache = allocate_kv_cache

run:驱动整个流程

  • • 把调度产物Sequence拼装为 model.forward 需要的 张量
  • • 调用 model.forward 计算 logits
  • • 采样出 token
  • • 清理本步 Context
defrun(self, seqs: list[Sequence], is_prefill: bool) -> list[int]:# Sequence → 张量    input_ids, positions = (self.prepare_prefill(seqs) if is_prefill # 下文介绍elseself.prepare_decode(seqs)           # 下一篇介绍    )# 在 GPU 上进行采样,所以 sampler 参数也需要存到 GPU 显存里    temperatures = torch.tensor(        [seq.temperature for seq in seqs],        dtype=torch.float32, device="cuda",    )# forward → logits → 采样出 token    logits = self.run_model(input_ids, positions)           # 后续详细介绍    token_ids = self.sampler(logits, temperatures).tolist() # 后续详细介绍# 清理本步的 Context    reset_context()return token_idsModelRunner.run = run

run_model:计算 logits

  • • 张量经过 model.forward 得到 hidden
  • • hidden 经过 lm_head 得到 logits
  • • 推理不涉及反向传播,使用 @torch.inference_mode 关闭 PyTorch 梯度计算
@torch.inference_mode()defrun_model(self, input_ids, positions):    hidden = self.model(input_ids, positions)returnself.model.compute_logits(hidden)ModelRunner.run_model = run_model

prepare_prefill:把变长 prompt 铺成张量

prefill 把多个 prompt 铺成一个张量,方便后续进行并行计算。

该方法产出五个对象:

  • • input_ids:把各序列要计算的新 token 首尾相接打平成一个一维数组。
  • • positions:每个新 token 的位置编号,接着前缀往后排(有前缀时从 start 开始,不从 0 开始)。
  • • cu_seqlens_q:各序列在打平数组里的 query 边界,形如 [0, 3, 9, 11],FlashAttention 据此切开变长 batch。
  • • cu_seqlens_k:key 的边界,长度等于前缀加新 token(有 prefix cache 时 k > q)。
  • • slot_mapping:每个新 token 要写入的物理 slot 下标。

铺好这些张量后,prefill 走 flash_attn_varlen_func:它用 cu_seqlens 把打平的 q/k 切回序列,做块对角 causal 注意力——每条序列只在自己内部算(块内 causal:第 i 个 query 只看自己和前面的 key),序列之间不算,省掉给短序列 padding 的显存。

defprepare_prefill(self, seqs: list[Sequence]):    input_ids = []    positions = []    cu_seqlens_q = [0]   # query(新 token)在打平数组里的边界    cu_seqlens_k = [0]   # key(前缀 + 新)的长度边界    max_seqlen_q = 0    max_seqlen_k = 0    slot_mapping = []    # 每个新 token 写到哪个物理 slot    block_tables = Nonefor seq in seqs:        start = seq.num_cached_tokens        # 已缓存前缀长度        seqlen_q = seq.num_scheduled_tokens  # 本步要算的新 token 数        end = start + seqlen_q        seqlen_k = end                       # key 总长 = 前缀 + 新        input_ids.extend(seq[start:end])     # 只取要算的那一段        positions.extend(range(start, end))  # 位置接着前缀往后排        cu_seqlens_q.append(cu_seqlens_q[-1] + seqlen_q)        cu_seqlens_k.append(cu_seqlens_k[-1] + seqlen_k)        max_seqlen_q = max(seqlen_q, max_seqlen_q)        max_seqlen_k = max(seqlen_k, max_seqlen_k)# —— slot_mapping:算出每个新 token 写到哪个物理 slot ——# slot = KV cache 里的一个物理槽位,一个 token 的 K/V 占一个。# 逻辑连续的 token,物理 block 可能不连续(paged),故逐 block 算。# start_block / end_block:[start, end) 覆盖的逻辑 block 范围,# end 向上取整,取成开区间(左闭右开)。        start_block = start // self.block_size        end_block = (end + self.block_size - 1) // self.block_sizefor i inrange(start_block, end_block):# block_table[i]:第 i 个逻辑 block → 物理 block 号# base:该物理 block 在大张量里的起始 slot 下标            base = seq.block_table[i] * self.block_size            slot_start = baseif i == start_block:            # 首块:前缀已写过,从偏移处起                slot_start += start % self.block_sizeif i != end_block - 1:          # 中间块:整块写满到 block_size                slot_end = base + self.block_sizeelse:                           # 末块:只写到 end,通常是半块                slot_end = base + end - i * self.block_size# [slot_start, slot_end) 这段槽位依次发给本块内的新 token            slot_mapping.extend(range(slot_start, slot_end))# 有前缀复用时才需要 block_tables(→ L5)if cu_seqlens_k[-1] > cu_seqlens_q[-1]:        block_tables = self.prepare_block_tables(seqs)# CPU list → pinned 张量 → 异步拷 GPU# pin_memory:页锁定内存,物理地址固定,DMA 可直读,省一次中转拷贝#   普通的 CPU 内存是可分页内存(pageable)#   操作系统的虚拟内存机制可能随时把它换出到磁盘#   或在物理内存里挪位置,物理地址不固定# non_blocking:把拷贝排进 CUDA stream 就返回,让 CPU 不干等;#   拷贝与 forward 同在默认 stream,按入队顺序执行,#   forward 一定等拷贝完才读,不会读到没拷完的数据。defto_cuda(x, dtype):        t = torch.tensor(x, dtype=dtype, pin_memory=True)return t.cuda(non_blocking=True)    input_ids = to_cuda(input_ids, torch.int64)    positions = to_cuda(positions, torch.int64)    cu_seqlens_q = to_cuda(cu_seqlens_q, torch.int32)    cu_seqlens_k = to_cuda(cu_seqlens_k, torch.int32)    slot_mapping = to_cuda(slot_mapping, torch.int32)# 写进 Context,透传给每一层 attention(→ L10)    set_context(True, cu_seqlens_q, cu_seqlens_k,        max_seqlen_q, max_seqlen_k,        slot_mapping, None, block_tables,    )return input_ids, positionsModelRunner.prepare_prefill = prepare_prefill

prepare_block_tables:记录历史 K/V 的地址

block_table:一条序列「逻辑块 → 物理块号」的清单,如 [3, 7, 1] 表示它的第 0、1、2 个逻辑块分别落在物理块 3、7、1。

何时用:无前缀复用时,K/V 当场算出、就在批里,不需要它;命中前缀缓存时,前缀 K/V 已在 KV cache 里,此时 key 比 query 长,即 cu_seqlens_k[-1] > cu_seqlens_q[-1],attention 只能凭 block_table 回 cache 读(→ L5)。

padding:各序列长短不一,用 -1 补齐成 (batch, 最长块数) 张量,-1 表空块,kernel 跳过。

defprepare_block_tables(self, seqs: list[Sequence]):# 最长的 block_table,决定矩形张量的列数    max_len = max(len(seq.block_table) for seq in seqs)# 每行一条序列,短的用 -1 补到 max_len,凑成规整矩形    bt = [        seq.block_table + [-1] * (max_len - len(seq.block_table))for seq in seqs    ]# CPU → pinned → 异步拷 GPU(同 prepare_prefill 的 to_cuda)    table = torch.tensor(bt, dtype=torch.int32, pin_memory=True)return table.cuda(non_blocking=True)ModelRunner.prepare_block_tables = prepare_block_tables

4. 集成验证

加载真实 Qwen3-0.6B,造一条 Sequence,跑一次 prefill,验证 ModelRunner 能否把它拼接成张量、输出第一个 token。

import torch.distributed as distfrom modelscope import snapshot_downloadfrom transformers import AutoTokenizerfrom nanovllm.sampling_params import SamplingParams# 单卡环境准备:nano-vllm 的网络层在构造时要查 world_size,# 这里先初始化一个单进程组(多卡版后续介绍)torch.cuda.set_device(0)ifnot dist.is_initialized():    dist.init_process_group("nccl""tcp://localhost:2333", world_size=1, rank=0)# 本地路径(Config 要求 model 是已存在的目录)model_path = snapshot_download("Qwen/Qwen3-0.6B")config = Config(model_path, enforce_eager=True, max_model_len=4096)runner = ModelRunner(config)tokenizer = AutoTokenizer.from_pretrained(model_path)# prompt → token ids(chat template)msgs = [{"role""user""content""你是谁"}]text = tokenizer.apply_chat_template(    msgs, tokenize=False, add_generation_prompt=True, enable_thinking=False,)prompt_ids = tokenizer(text).input_ids# 造一条 Sequence,整段 prompt 一次 prefillseq = Sequence(prompt_ids, SamplingParams(temperature=0.6))seq.num_scheduled_tokens = len(seq)               # 整段都要算seq.block_table = list(range(seq.num_blocks))     # 看一眼 prepare_prefill 铺出来的张量input_ids, positions = runner.prepare_prefill([seq])ctx = get_context()print("prompt tokens :"len(prompt_ids))print("input_ids[:8] :", input_ids[:8].tolist())print("positions[:8] :", positions[:8].tolist())print("cu_seqlens_q  :", ctx.cu_seqlens_q.tolist())print("slot_mapping[:8]:", ctx.slot_mapping[:8].tolist())reset_context()
Downloading Model from https://www.modelscope.cn to directory: /DATA/disk5/cache/modelscope/models/Qwen/Qwen3-0.6B2026-05-28 18:10:33,327 - modelscope - INFO - Target directory already exists, skipping creation.prompt tokens : 14input_ids[:8] : [151644, 872, 198, 105043, 100165, 151645, 198, 151644]positions[:8] : [0, 1, 2, 3, 4, 5, 6, 7]cu_seqlens_q  : [0, 14]slot_mapping[:8]: [0, 1, 2, 3, 4, 5, 6, 7]
# 端到端:一批 Sequence → 第一个 next tokentoken_ids = runner.run([seq], is_prefill=True)print("first next token id :", token_ids[0])print("decoded             :", tokenizer.decode(token_ids))
first next token id : 104198decoded             : 我是

5. 小结

ModelRunner 是调度器与模型之间的中间层:向上接收 Sequence 对象,拼接张量,forward 完再把 logits 转为 token。

__init__ 备好模型与 cache,run 串起 prepare → forward → sample,prepare_prefill 把变长 prompt 打平、用 cu_seqlens 标边界、slot_mapping 逐 block 算出每个新 token 的物理写入位置。

下一篇讲解 prepare_decode——decode 怎么在 prefill 留下的状态上,继续生成 token。

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