乐于分享
好东西不私藏

Nano-vLLM 源码解读 - 4. BlockManager

Nano-vLLM 源码解读 - 4. BlockManager

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

推理引擎运行时,每个 step 都要处理几件耗显存的事:新到的序列要一次性写入整段 prompt 的 KV;已在运行的序列每个 step 追加一个 token 的 KV;显存紧张时要把某条序列整体换出、把它占用的 KV 块全数归还;两条序列前缀相同时希望共用一份 KV 而不是各算一遍。这些动作都发生在"物理块"(PagedAttention 把 KV Cache 切出的定长槽位)这一粒度上,并且都在 step 的关键路径上——慢一点,整轮吞吐就会明显下降。

BlockManager 就是回答以下问题的组件:现在能不能给某条序列分配 N 个块?某条序列下一个 step 追加一个 token,需不需要新块?某条序列离场了,它占用的块怎么登记回去?两条序列共用同一块时,谁先离场谁该真正释放?整个 engine/block_manager.py 只有 120 行,但每个 step 都会经过它。

这 120 行围绕 4 个数据结构和 5 个公开 API 展开。其中 len(seq) % bs == 1 与 reversed(seq.block_table) 这两处最关键——前者把"是否需要新块"压缩成一行算术,后者只用一个 reversed 让 deque 起到 LRU 队列的作用。


1. 系统位置

BlockManager 是 Scheduler 内部的一个组件,做的事情只有一件:维护"哪些物理块空着、哪些被谁占着"。它不接触 KV 张量,整个 engine/block_manager.py 没有一行 import torch。真正持有 KV Cache 的是另一个模块 ModelRunner——它在启动时用 torch.empty 一次性申请一大块显存,按物理块切好备用。两者通过一份整数列表对齐:seq.block_table: list[int],每条序列各持一份,第 i 个元素是该序列第 i 个逻辑块所对应的物理块号;前向时 GPU 按下标查到对应的物理槽位,再去那里读 K/V。

BlockManager 系统位置:CPU 侧登记块号,GPU 侧存取 KVSchedulerschedule()preempt()postprocess()调用 4 个分配类 API调用 deallocate调用 deallocateBlockManager · 管块号 · 无 torch5 个公开 APIcan_allocateallocatecan_appendmay_appenddeallocate4 个内部数据结构(仅由上面 5 个 API 修改)blocks: list[Block]块元数据池(id / ref / hash / tokens)free_block_ids: deque[int]空闲块队列(FIFO,O(1) 取头)used_block_ids: set[int]占用块集合(O(1) 归还)hash_to_block_id: dict[int → int]块级复用反查表整个 block_manager.py 不接触 torch / 张量 / CUDAModelRunner · 持 KV 张量 · 有 torch物理块池 · 16 个定长 KV 槽位(启动时 torch.empty 一次性切好)0123456789101112131415每槽位容量 = block_size 个 token 的 K + V(实际生产中槽位数常达数千至数万):某条 seq 当前持有的物理块,其块号写入下方 block_tableseq.block_table每条序列一份,长度 = 已分配块数,每个值是物理块号[ 7, 12, 3 ]BlockManager 写入并维护ModelRunner 把每个整数当索引取 KV

图自上而下分三块。先看上面的 Scheduler。

Scheduler 在三个时刻会调用 BlockManager(图中三种颜色的箭头,橙=schedule、红=preempt、蓝=postprocess):每个 step 开始时,由 schedule() 调用"分配类"的 4 个 API(can_allocate / allocate / can_append / may_append)做入场判断与块追加;显存不够时,由 preempt() 调 deallocate 把某条序列的块全部归还;序列写完一步后,由 postprocess() 调 deallocate 收尾。

BlockManager(黄色框)内部只有 4 个数据结构:blocks 块元数据池、free_block_ids 空闲块队列、used_block_ids 占用块集合、hash_to_block_id 块级复用反查表。这 4 个结构都只能由上方那 5 个公开 API 修改,对外不暴露。BlockManager 对系统其余部分修改的唯一状态,是每条序列的 seq.block_table——一串整数,每个整数是一个物理块号。

ModelRunner(蓝色框)持有 KV 张量。图中右侧的网格代表它在启动时切好的物理块池,共 16 个定长槽位(实际生产环境中常达数千至数万)。每个槽位容量等于 block_size 个 token 的 K + V。槽位之间是平等的,BlockManager 把哪几个槽位分给哪条序列,完全由它自己说了算。

底部的橙色长条就是这份 seq.block_table = [ 7, 12, 3 ]——它既是 BlockManager 的输出,也是 ModelRunner 的输入。BlockManager 写入并维护它(左侧橙色"写"箭头);ModelRunner 在前向时把每个整数当作物理块池的索引,到对应槽位上读 K/V(右侧蓝色"读"箭头)。图中网格里被高亮的 3、7、12 号槽位,正是列表中那三个整数指向的物理位置。CPU 侧只负责登记,GPU 侧只负责读取,两边完全靠这一个列表保持一致。

后面要讲的 4 个数据结构和 5 个 API,都在回答同一个问题:用最少的开销维护 seq.block_table 这串整数

需要先建立一个概念:块级复用。两条序列前缀相同时,让后到的那条直接把自己的 block_table 前几项指向前者已写满的物理块,省去对这段前缀重新做 prefill 的算力。本讲只讲 BlockManager 如何登记可被复用的物理块(在 Block.hash 与 hash_to_block_id 中留下入口),具体触发复用的时机、命中判断流程不在本讲范围之内。


2. Block 子对象

classBlock:    block_id: int# 物理偏移,不变    ref_count: int# 持有此块的 seq 数(0 / 1 / >1)hashint# 块内容指纹(int64,-1 = 未标记)    token_ids: list# 块实际存放的 token 序列,用于内容校验

把同一块的元数据聚拢到 Block 类里,可以按 block_id 一次取齐 ref_count / hash / token_ids,避免 4 个并列字典各查一次,也更便于阅读和扩展。

hash 字段先在这里作存在性说明:它是块内容的 int64 指纹(下文统一称作 hash,必要时括号补"指纹"二字作回忆性提示)。Scheduler 在 postprocess 阶段会扫描这一步内"刚写满"的块,调 hash_blocks 算出指纹并写入 Block.hash,同时把这条 hash → block_id 注册到反向索引 hash_to_block_id,作为块级复用的命中入口。此处仅作存在性说明,不展开具体计算方式与复用流程。

reset() 直接置 ref_count = 1 而不是 0:_allocate_block 的唯一调用语义就是分配后立刻被某条 seq 使用,因此 reset() 直接把 ref_count 置 1,省去调用方再 += 1


3. 四个核心数据结构

self.blocks: list[Block]                 # 按 id O(1) 取self.hash_to_block_id: dict[intint]    # 内容指纹反查物理块self.free_block_ids: deque[int]          # 空闲队列(FIFO 决定 LRU)self.used_block_ids: set[int]            # 在用集合(成员判定)
结构
关键操作
复杂度
为什么是这种结构
blocksblocks[i]
O(1)
按 id 直接索引
hash_to_block_idget / del
O(1) 平均
按内容指纹反查物理块(块级复用入口)
free_block_idspopleft / append
O(1)
两端 O(1) 的双端队列;FIFO 顺序蕴含 LRU 时间序
used_block_idsin / add / remove
O(1)
只做成员判断,不需要顺序

hash_to_block_id 是块级复用的查询入口:一条新序列把自己前 k 块 token 各算出 hash,逐一去这张表里查"是否已有别的物理块存着相同 KV"。命中即可把那个物理块号直接挂到自己 block_table 上,省去这部分 prefill 的算力。

free_block_ids 选 deque 而不是 list 或 set 的理由:本组要求两端 O(1)。队头是分配口(popleft),队尾是归还口(append),队尾→队头的方向正好蕴含一种时间序——离队尾近的是最近释放的,离队头近的是最久没被使用的。这条时间序如何被复用为 LRU,§6 再展开。

底层的基础操作只有两个:

def_allocate_block(self) -> int:    block_id = self.free_block_ids.popleft()        # 从队头取最久未用的块号(LRU 端)    block = self.blocks[block_id]                    # 块号 → Block 元数据if block.hash != -1andself.hash_to_block_id.get(block.hash) == block_id:delself.hash_to_block_id[block.hash]       # ⚠️ 守卫:清掉脏 hash,避免再被命中    block.reset()                                    # ref_count=1, hash=-1, token_ids=[]self.used_block_ids.add(block_id)                # 登记为"使用中"return block_iddef_deallocate_block(self, block_id: int):self.used_block_ids.remove(block_id)             # 从"使用中"集合移除self.free_block_ids.append(block_id)             # 推回队尾,下次轮到队头才被复用(LRU)

del self.hash_to_block_id[...] 这一行是安全守卫:刚被 popleft 的块可能曾经登记在反向索引里(用作某段已写满前缀的复用入口),不清掉这条 entry,后续就会查到一个"内容即将被覆写"的脏块。hash != -1 是先决条件:hash == -1 是未标记标志位,代表这块从未被写满或刚被 reset 清空,不曾注册到反向索引,没有 entry 可清;这里先判 != -1 是为了跳过那些不应被复用、也不需要清守卫的块。


4. 五个公开 API 与四个数据结构的对应

上一节讲了底层的 _allocate_block / _deallocate_block,本节看 Scheduler 实际调用的 5 个公开 API 怎么编排它们,并梳理这 5 个 API 触达哪些数据结构。按生命周期三阶段成对出现:

BlockManager:5 个 API ↔ 4 个数据结构每张卡片下的色块表示该 API 对各数据结构的访问:灰=不动 / 浅蓝=只读 / 深蓝=读写📦 4 个数据结构(图例颜色)blockslist[Block]按 id O(1) 取 Block 对象hash_to_block_iddict[int, int]prefix cache 反查表free_block_idsdeque[int]空闲块 FIFO,popleft 出 / append 入used_block_idsset[int]在用块成员判断 O(1)阶段 ① prefill 入场阶段 ② decode 增量阶段 ③ 离场归还can_allocate(seq)→ int (-1 = 装不下;否则 = 命中块数)沿 hash 链查 prefix cache,预估"复用几块、要新几块、空闲够吗"纯只读,不动任何状态访问:blocks Rhash Rfree Rused Rallocate(seq, num_cached_blocks)→ None (写入 seq.block_table)三类块的写入:① 共享: ref++(cached, used)② 复活: free.remove + ref=1③ 全新: _allocate_block访问:blocks RWhash W*free RWused Wcan_append(seq)→ bool本步 decode 是否需要新块?且空闲池是否够 1 块?len(free) >= (len(seq) % bs == 1)纯只读,单行表达式访问:blocks —hash —free Rused —may_append(seq)→ None需要时追加一个新物理块到seq.block_table 末尾if len(seq) % bs == 1: alloc访问:blocks RWhash W*free Wused Wdeallocate(seq)→ None (清空 seq.block_table)倒序遍历 block_table,逐块:• ref_count -= 1• 减到 0 → _deallocate_block(free.append, used.remove)⚠️ 倒序的玄机前缀块(最有复用价值)后释放,在 free deque 末端,最不易被覆写。这是 prefix-cache 友好的 LRU访问:blocks RWhash W*free Wused W* hash W:经 _allocate_block / _deallocate_block 间接清理脏 hash 映射第 6 个 API 是 hash_blocks(仅写 hash + blocks)—— 它是 L5 prefix cache 的入口,本图省略

右侧 4 个数据结构正是 §3 介绍过的那 4 个。图中三种颜色分别对应 schedule / preempt / postprocess 三个调用阶段;左侧 5 个 API 通过箭头连接右侧 4 个数据结构,展示每个 API 实际触达哪些状态。

4.1 prefill 入场:can_allocate / allocate

defcan_allocate(self, seq) -> int:# 查询是否有可复用的物理块(本讲不展开机制),并预估"可复用几块、要新几块"# 返回 -1(装不下)或可复用块数defallocate(self, seq, num_cached_blocks):# num_cached_blocks 是 can_allocate 返回的可复用块数,调用方原样传回for i inrange(num_blocks):        token_ids = seq.block(i)        h = compute_hash(...) if i < num_blocks - 1else -1        block_id = self.hash_to_block_id.get(h, -1)if block_id == -1orself.blocks[block_id].token_ids != token_ids:# ② 全新申请:未命中或内容碰撞,走底层分配            block_id = self._allocate_block()else:# ① 复用已存在的物理块:ref_count += 1(若在 free 池则同时移出)            ...        seq.block_table.append(block_id)

两个细节:

  • • num_cached_blockscan_allocate 已经数出来这条 seq 前缀可复用几块,allocate 直接拿来用,避免重复扫一遍 hash
  • • can_allocate 循环到 num_blocks - 1:最后一块通常未写满,因此不参与块级复用判断
  • • blocks[block_id].token_ids != token_ids 这一步是内容碰撞防护:64-bit 指纹极少碰撞,但一旦碰撞就会读到错误 KV,因此 hash 命中后还要再做一次完整 token 序列比较,比较失败则退回到全新申请分支

4.2 decode 增量:can_append / may_append

defcan_append(self, seq) -> bool:# 右边布尔 → 0/1:不需要新块=0,需要=1;左边是 free 池剩余块数returnlen(self.free_block_ids) >= (len(seq) % self.block_size == 1)defmay_append(self, seq):iflen(seq) % self.block_size == 1:                  # 刚越过块边界,块表差一块        seq.block_table.append(self._allocate_block())   # 申请新块号挂到块表末尾

len(seq) % bs == 1 是整个 BlockManager 中最关键的一行:

decode 时间轴:何时 may_append 触发?(block_size = 4,prompt 长 4)每步起始 len(seq) = N,要为位置 N-1 写 K/V;当 N % 4 == 1 时块表"差一块",触发 may_appenddecode T=1T=2T=3T=4T=5起始 len(seq)len % 4may_append?block_table5678912301✓ 分配 b1block_table 加 1— 不动 —— 不动 —— 不动 —✓ 分配 b2block_table 加 1b0b1b0b1b0b1b0b1b0b1b2绿色 = 本步刚分配的新块 · prefill 后 len 已是 5,因为 prefill 末尾 postprocess 已经 append 了第一个采样 token

记 N = len(seq) 为序列当前总 token 数,bs = block_size。本步刚生成第 N 个 token(其下标为 N-1),需要将它的 K/V 写到块索引 ⌊(N-1)/bs⌋ 处。已分配块数等于"已写满或正在写的块数",即 ⌈(N-1)/bs⌉。当 N-1 是 bs 的整数倍(即上一块刚好写满)时 ⌈(N-1)/bs⌉ = (N-1)/bs;否则 ceil 等于整数除法的商加 1,即上一块尚未写满,仍在原块中追加。当 N-1 恰好落在新块的第 0 个位置(即 (N-1) mod bs == 0,等价于 N mod bs == 1),所需块索引比已分配块数大 1,块表"差一块"——触发 may_append

can_append 中的一行 len(self.free_block_ids) >= (len(seq) % self.block_size == 1) 把两个判断合并写在一起。右边 len(seq) % self.block_size == 1 求得布尔值,被 Python 自动转换为 0 或 1,分别代表"本步无需新块"与"本步需要 1 块新块";左边是 free 池剩余块数。两边比较即"free 池剩余 ≥ 本步所需"。等号即恰好够用——剩 0 块且本步不要,或剩 1 块且本步要 1 块;再多 1 个 token 进来就要触发抢占。

4.3 离场归还:deallocate

defdeallocate(self, seq):for block_id inreversed(seq.block_table):    # 倒序:让前缀块沉到 free deque 队尾(第 6 节)        block = self.blocks[block_id]        block.ref_count -= 1# 每条引用这块的 seq 各减一次if block.ref_count == 0:                   # 最后一个引用走了才真正归还self._deallocate_block(block_id)    seq.num_cached_tokens = 0# 重置此序列在 hash_to_block_id 中已命中的 token 计数# (块级复用的累计量),便于下次复用判断    seq.block_table.clear()                        # 清空块表,序列与所有物理块脱钩

减引用计数,ref_count == 0 表示没有任何 seq 还持有这块,可推回 free deque 等待复用;ref_count > 0 意味着仍有别的 seq 在用这块(共享前缀场景),此次 deallocate 不能动它的物理位置。reversed 的作用见第 6 节。


5. 块生命周期

把 5 个 API 收束成"块视角"的状态机:

Block 生命周期:FREE ↔ USED·独占 ↔ USED·共享蓝箭头 = 分配 / 共享(前进);红箭头 = 引用减一(后退);黄圈 = 共享后再共享FREEref_count = 0在 free_block_ids 队列里没人持有,待复用hash 字段保留可被块级复用命中USED · 独占ref_count = 1在 used_block_ids 集合里独占 · 可写某条 seq 的 block_table 指着decode 在它里面追加 tokenUSED · 共享ref_count > 1在 used_block_ids 集合里只读 · 多 seq 共享N 条 seq 的 block_table 都指着(必为 prompt 已写满的块)_allocate_blockref: 0 → 1deallocateref: 1 → 0allocate (prefix 命中)ref: 1 → 2deallocate (一条 seq 走了)ref: N → N−1(仍 ≥ 1)再有 seq 命中 → ref++关键不变式USED·共享 永远不直接回 FREE——必须先经 USED·独占(最后一个引用减到 1,再减为 0 才归还)。共享块永远只读:能被共享的必是 prompt 已写满的块,hash 已稳定,没人会再往里写。

图中以圆角矩形表示块的三种状态,分别对应 ref_count 取 0 / 1 / >1 三态:

  • • FREE(ref_count == 0:没有任何 seq.block_table 指向它,块在 free deque 队列里等待复用。
  • • USED·独占(ref_count == 1:恰好一条 seq 的 block_table 指向它,归这条 seq 独占、可写。
  • • USED·共享(ref_count > 1:N 条 seq 的 block_table 同时指向它,只读(详见下文)。

箭头标注触发该转移的 API。读图前先界定三个概念。

hash 是什么? 块内容(block_size 个 token id)经 hash 函数压成的一个 int64 指纹(实现里用的是 xxhash)——相同 token 序列必然算出相同 hash。反过来 hash_to_block_id 字典就成了一张反向索引:哪个物理块已经存着某段 token 的 KV。如果未来有别的 seq 想用相同 token 序列的 KV,可以通过这个反向索引找回这块。本讲不展开具体复用流程。

为什么 FREE 状态下 hash 仍然有效? 因为 deallocate 只清 seq.block_table、把 block_id 推回 free deque——没动 Block.hash 字段,也没删 hash_to_block_id 里的 entry。这块的指纹和反向索引都还指着它,KV 数据物理上也还在池里。一条新 seq 带相同前缀过来时能查到、能把它从 free 队列中取出并将 ref_count 重置为 1 直接复用。_allocate_block 里那条脏 hash 守卫处理的正是反向场景:如果不是被命中复用,而是被 popleft 走(即将被新内容覆写),那旧 hash 必须清掉,否则下次有人查这个 hash 会读到内容已变的脏块。结论:释放并不意味着失效——这是块级复用的物理基础。

共享块(USED·共享,ref_count > 1)是什么? 多条 seq 的 block_table 同时指着同一物理块——它们在 attention forward 时都读同一份 KV,由此一份已算好的 KV 可被多条 seq 共用,避免重复计算。典型场景:相同 system prompt 的并发请求。

三条 system prompt 相同的 seq 共享同一物理块(ref_count = 3)三条独立 seq 的 block_table:Seq A.block_table =#7#3Seq B.block_table =#7#11Seq C.block_table =#7#2物理块 #7ref_count = 3hash = h_sysprompttoken_ids = [system prompt …]USED · 共享 · 只读(已写满,hash 已稳定)💡 共享块永远是已写满的 prompt 块(只读);decode 追加的新块走 _allocate_block,必为独占。所以根本不存在并发写冲突 → 不需要 copy-on-write,不需要写锁。

图中绿色边框的 #7 块即被三条 seq 同时持有的共享块,ref_count = 3;蓝、橙边框是各自独占的后续块。

为什么共享的必是"已写满的 prompt 块"? 两个条件都得满足:

  • • 写满 → 指纹稳定:半满块还会追加 token,hash 会变。若半满块可共享,每追加一个 token 都要通知所有共享方失效,失效开销会很高。因此"写满 + 算 hash + 注册到反向索引"是一组动作——只有满足这一组动作的块才有资格被命中、被共享。
  • • prompt → 内容固定:prompt 是 prefill 一次性算完的,token 序列确定;decode 是逐 token 采样,带随机性,两条 seq 此刻输出相同下一步也可能分叉。所以 decode 产生的块永远独占——may_append 总是调用 _allocate_block 申请新块就是这个原因。

合起来:能被共享的块都是写满的、内容不会再变的、指纹已稳定的、注册到反向索引中的 prompt 块。USED·共享 不直接回 FREE 也是同一套约束的体现:每次 deallocate 只把 ref_count 减 1;当 ref_count 从 N(>1)减到 1,块仍被一条 seq 持有,状态由"共享"降为"独占";只有再被那条 seq deallocate,ref_count 才到 0,块才真正回到 FREE。

对比 fork 式 KV 复用——每条 seq 各拷贝一份后再独立修改——这里 attention 是只读访问,共享块期间不会被任何 seq 写入,所以不需要 copy-on-write,也不需要写锁——这是 PagedAttention 在引擎层省去的一类实现复杂度。


6. reversed 是 LRU 的关键

LRU(Least Recently Used)即最久未被使用的优先被驱逐。这里的目标是让最不该被覆写的块——通常是已成为多条 seq 共用前缀的那些——在 free 队列里待得最久,越久不被 popleft 选中,越有机会等到下一次复用命中。

deallocate 中的 reversed(seq.block_table) 并非随意的实现选择:

倒序释放 + deque 方向性 = 前缀块沉到队尾,最不易被覆写① Beforeseq.block_table(即将 deallocate):b0prefixb1b2b3尾部free_block_ids 现状:head →#20#15#8← tail② reversed iterfor block_id in reversed(seq.block_table):→ 释放顺序:b3b2b1b0每次 _deallocate_block(b) → free_block_ids.append(b)③ Afterfree_block_ids 末态:head →#20#15#8b3b2b1b0← tail下次 popleft 从这里取(先取 #20↑ b0 沉到最深,最不易被覆写💡 倒序释放 → 前缀块(最有复用价值)最后入队、最靠近 tail;popleft 永远从 head 取 → 前缀块最久未被覆写。没有 LRU 数据结构,光靠 deque 方向性 + 一行 reversed 就够了。如果是顺序释放,prefix cache 命中率会断崖式下降。

图中左右两图分别对应顺序释放与倒序释放:左图按 [block0, block1, block2, ...] 的顺序逐个 append 到 free deque,前缀块 block0 落在队首,下一次 popleft 立即被取走;右图按反向顺序依次 append,前缀块 block0 最后入队,落在队尾,最迟才会被 popleft 选中覆写。

结论:

  • • 倒序释放 + deque popleft 取 / append 入:前缀块(最有复用价值的部分)沉到队尾,最不易被覆写
  • • 没有专门的 LRU 数据结构,靠 deque 方向性已经足够
  • • 如果没有 reversed,前缀块会被优先覆写,块级复用率会显著下降

7. 总结

把这一讲的几个要点串起来:

  • • 位置定位:BlockManager 由 Scheduler 持有,对外只修改 seq.block_table 这串整数;真正的 KV 张量在 ModelRunner——它管的是块号,不是 KV 张量本身。
  • • 4 个 O(1) 元数据结构blocks 索引 Block 对象、free_block_ids 排空闲队列、used_block_ids 判成员、hash_to_block_id 按内容指纹反查物理块,全 O(1)。
  • • 5 个 API 按生命周期分组schedule() 调 can_allocate / allocate / can_append / may_appendpreempt() 调 deallocatepostprocess() 调 deallocate
  • • 块的三态ref_count 区分 FREE / USED·独占(=1)/ USED·共享(>1)。USED·共享 不直接回 FREE,必经 USED·独占。
  • • 释放并不意味着失效deallocate 不清 Block.hash、也不删 hash_to_block_id entry——这是已释放物理块仍可被新序列复用的物理基础。
  • • reversed(seq.block_table):归还时倒序遍历,让最有复用价值的前缀块沉到 free deque 队尾,最不易被覆写——免去专门 LRU 数据结构。

下面这段视频把"一块物理 KV 块的一生"完整跑了一遍——它怎么被分配、写满、归还到 free deque、又被新请求复用:

已关注
关注
重播 分享
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-12 12:38:28 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/611518.html
  2. 运行时间 : 0.102039s [ 吞吐率:9.80req/s ] 内存消耗:4,898.77kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=b603aa64c11f1c5a0fecf764231f53bf
  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.000641s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000966s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000770s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000288s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000660s ]
  6. SELECT * FROM `set` [ RunTime:0.000240s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000679s ]
  8. SELECT * FROM `article` WHERE `id` = 611518 LIMIT 1 [ RunTime:0.000531s ]
  9. UPDATE `article` SET `lasttime` = 1778560708 WHERE `id` = 611518 [ RunTime:0.016910s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000457s ]
  11. SELECT * FROM `article` WHERE `id` < 611518 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000618s ]
  12. SELECT * FROM `article` WHERE `id` > 611518 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000411s ]
  13. SELECT * FROM `article` WHERE `id` < 611518 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001307s ]
  14. SELECT * FROM `article` WHERE `id` < 611518 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002557s ]
  15. SELECT * FROM `article` WHERE `id` < 611518 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001054s ]
0.104204s