当前位置:首页>Linux>Linux 文件系统一致性: 从崩溃恢复到 Journaling 机制

Linux 文件系统一致性: 从崩溃恢复到 Journaling 机制

  • 2026-01-22 15:33:03
Linux 文件系统一致性: 从崩溃恢复到 Journaling 机制

Linux 文件系统一致性: 从崩溃恢复到 Journaling 机制

概览摘要

文件系统一致性是存储系统的生命线. 当系统突然掉电或崩溃时, 如果不能保证数据结构的完整性, 轻则丢失用户数据, 重则文件系统彻底损坏. 这就是为什么 Linux 文件系统需要复杂的一致性保证机制

本文深入探讨 Linux 文件系统如何面对这个挑战: 从最初的同步写入到现代的 Journaling 机制, 从元数据保护到数据完整性校验. 我们会剖析 ext4、Btrfs、XFS 等主流文件系统的实现细节, 揭示它们如何在性能和安全之间找到平衡点. 通过理解这些底层机制, 你会认识到看似简单的"文件操作"背后有多少工程智慧

核心概念详解

什么是文件系统一致性

文件系统一致性指的是磁盘上的数据结构和内存中的视图保持同步, 满足特定的不变式(invariants). 简单理解就是: 无论何时中断, 文件系统都能恢复到一个合法的状态

比如, 当你删除一个文件时, 需要同时更新三处地方:

  • • inode 位图(标记该 inode 为空闲)
  • • 数据块位图(标记数据块为空闲)
  • • 父目录项(删除目录条目)

如果只完成了其中一两步就掉电, 文件系统就进入了不一致状态: 可能 inode 仍被标记为占用, 但对应的数据块已被清空, 导致垃圾文件占据磁盘空间

三类一致性问题

元数据不一致: 位图、inode、超级块等管理结构出现矛盾. 这是最严重的, 会导致文件系统彻底崩坏

数据泄露: 已删除文件的数据块未被正确释放, 残留数据可能被新文件覆盖, 造成信息泄露

数据损坏: 文件内容被不完整的写入中断, 导致文件数据不完整或乱码

Journaling 的基本思想

想象你在账本上记账. 传统方式是直接修改账本, 结果掉电了, 数据一半没写. 更聪明的办法是先在日志本上记录"要做什么", 然后再执行, 最后在日志上打个勾. 即使中途掉电, 恢复时只需扫描日志本就知道该做什么

文件系统 Journaling 的原理完全一样: 在真正修改磁盘数据前, 先把这次操作的所有变更写进一个 journal 日志区域. journal 采用循环写入, 一旦操作成功确认, 该日志项就可被覆盖

Ordered vs Writeback vs Data Journal

Ordered 模式(ext4 默认):

  • • 元数据修改进日志
  • • 用户数据先写, 再更新元数据
  • • 这样即使元数据成功提交但数据未写, 至少数据本身是完整的

Writeback 模式:

  • • 只有元数据进日志
  • • 用户数据写入没有特殊顺序保证
  • • 最快, 但数据文件可能看到旧数据(虽然元数据一致)

Data Journal 模式:

  • • 所有变更(包括用户数据)都进日志
  • • 最安全, 但 journal I/O 翻倍, 性能最差

实现机制深度剖析

数据结构

Journal 日志结构

// Linux 内核 journal 核心数据结构
typedef
struct journal_s {
    unsigned
 long       j_flags;           // 日志状态标志
    unsigned
 long       j_total_len;       // 日志总大小(块数)
    unsigned
 long       j_blk_offset;      // 日志在磁盘上的偏移

struct mutex        j_checkpoint_mutex;
// 检查点保护
struct buffer_head  *j_sb_buffer;
      // 超级块缓冲
    journal_superblock_t
 *j_superblock;    // 日志超级块

    spinlock_t
          j_list_lock;       // 保护事务列表
struct journal_head *j_checkpoint_transactions;


    unsigned
 long       j_tail;            // 日志尾部指针
    unsigned
 long       j_tail_sequence;   // 尾部序列号
    unsigned
 long       j_transaction_sequence;  // 事务序列号

    wait_queue_head_t
   j_wait_transaction_locked;  // 事务锁等待队列
} journal_t;

关键字段解释:

  • • j_flags: 记录日志是否启用、是否需要恢复等状态
  • • j_tailj_transaction_sequence: 日志指针环形队列的关键, 防止日志覆盖未确认的项
  • • j_checkpoint_mutex: 保护检查点操作, 确保日志安全回收

事务结构

// 事务描述结构
typedef
struct transaction_s {
    journal_t
           *t_journal;        // 所属日志
    unsigned
 long       t_tid;             // 事务ID
    unsigned
 int        t_state;           // 事务状态
    unsigned
 long       t_log_start;       // 在日志中的起始位置

struct buffer_head  *t_descriptor_buffer;
     // 事务描述符块

struct journal_head *t_buffers;
        // 该事务包含的buffer_head链表
struct journal_head *t_checkpoint_list;
      // 检查点列表
struct journal_head *t_inode_list;
           // inode列表

    spinlock_t
          t_handle_lock;    // 保护handle计数
    int
                 t_updates;        // 未提交的handle数

    __u32               t_log_csum;       // 日志校验和(防止日志损坏)
} transaction_t;

buffer_head 的 journal 扩展

// 每个缓冲块都可能属于日志事务
struct journal_head {

struct buffer_head  *b_bh;
            // 指向实际缓冲

    transaction_t
       *b_transaction;   // 所属事务(运行中)
    transaction_t
       *b_next_transaction;     // 下一个事务(排队中)

    unsigned
 int        b_jlist;          // 在事务中的位置(metadata/data/revoke)
    unsigned
 long       b_modified;       // 修改标记
};

数据流向与操作序列

内存布局与 Journal 循环队列

核心算法: 事务生命周期

第1阶段: Running - 事务运行

// 内核代码简化版
handle_t
 *ext4_journal_start(struct inode *inode, int blocks) {
    journal_t
 *journal = EXT4_JOURNAL(inode->i_sb);
    transaction_t
 *transaction;

    // 获取当前事务或创建新事务

    spin_lock(&journal->j_state_lock);
    transaction = journal->j_running_transaction;
    if
 (!transaction) {
        // 没有运行事务, 创建新的

        transaction = kzalloc(sizeof(transaction_t), GFP_NOFS);
        transaction->t_tid = ++journal->j_transaction_sequence;
        transaction->t_state = T_RUNNING;
        journal->j_running_transaction = transaction;
    }

    // 分配handle, 这允许多个进程并发修改

    handle_t
 *handle = kzalloc(sizeof(handle_t), GFP_NOFS);
    handle->h_transaction = transaction;
    transaction->t_updates++;  // 增加handle计数

    spin_unlock(&journal->j_state_lock);
    return
 handle;
}

第2阶段: Locked - 事务锁定(准备提交)

// 停止接收新handle, 准备提交
int
 ext4_journal_stop(handle_t *handle) {
    transaction_t
 *transaction = handle->h_transaction;

    spin_lock(&transaction->t_handle_lock);
    transaction->t_updates--;  // handle计数递减

    if
 (transaction->t_updates == 0 && 
        transaction->t_state == T_RUNNING) {
        // 最后一个handle, 转移到锁定状态

        transaction->t_state = T_LOCKED;

        // 不再接收新的handle加入此事务

        journal->j_running_transaction = NULL;
    }
    spin_unlock(&transaction->t_handle_lock);

    return
 0;
}

第3阶段: Commit - 提交到日志

这一步是 Journaling 的核心, 分为多个子步骤:

// 这是最关键的一步: 保证日志写入
int
 journal_commit_transaction(journal_t *journal) {
    transaction_t
 *commit_transaction = journal->j_committing_transaction;
struct journal_head *jh;

    int
 err;

    // 步骤1: 写事务描述符块

    // 这告诉恢复代码"一个新事务开始了"

    write_buffer_to_journal(commit_transaction->t_descriptor_buffer);
    journal_wait_on_commit_record(journal);  // 等待写入完成

    // 步骤2: 写所有元数据块(可能并发)

    journal_submit_data_buffers(journal, commit_transaction);
    journal_wait_on_data_buffers(journal);   // 等待所有数据块写完

    // 步骤3: 写提交块(关键点!)

    // 一旦这个块写到磁盘, 事务即可被认为已成功提交

    // 恢复时, 只需扫描已有提交块的事务即可重做

    write_commit_block(commit_transaction);
    journal_wait_on_commit_record(journal);

    // 步骤4: 标记为已提交, 准备回收

    commit_transaction->t_state = T_FINISHED;

    return
 0;
}

第4阶段: Checkpoint - 检查点和回收

// 后台定期运行, 将已提交事务的数据写回原位置
int
 journal_do_checkpoint(journal_t *journal) {
struct journal_head *jh;

    transaction_t
 *transaction;

    // 遍历已完成的事务

    transaction = journal->j_checkpoint_transactions;

    while
 (transaction) {
        jh = transaction->t_buffers;

        while
 (jh) {
            // 写回buffer到原位置

            if
 (buffer_dirty(jh->b_bh)) {
                sync_dirty_buffer(jh->b_bh);
            }

            // 从事务中移除此buffer

            __journal_unfile_buffer(jh);
            jh = jh->b_tnext;
        }

        // 整个事务都写回了, 可以回收日志空间

        __journal_drop_transaction(journal, transaction);
        transaction = transaction->t_next;
    }

    return
 0;
}

崩溃恢复机制

系统启动时运行 fsck 的日志恢复阶段. 关键思路是: 只重新执行那些已经提交到日志的事务

// 恢复过程的核心函数
int
 journal_recover(journal_t *journal) {
    journal_superblock_t
 *sb = journal->j_superblock;
struct buffer_head *bh;

    unsigned
 long next_log_block;

    // 确定恢复范围

    next_log_block = be32_to_cpu(sb->s_start);
    if
 (next_log_block == 0)
        return
 0;  // 日志为空, 无需恢复

    printk(KERN_INFO "journal: recovering from log %lu to %lu\n",
           next_log_block, be32_to_cpu(sb->s_maxlen));

    // 扫描所有日志块

    while
 (next_log_block != journal->j_tail) {
        bh = journal_get_descriptor_buffer(journal, next_log_block);

        if
 (!is_valid_descriptor(bh)) {
            // 无效的描述符块, 扫描停止

            break
;
        }

        // 扫描此事务的所有块

        journal_scan_transaction(journal, next_log_block, bh);

        next_log_block++;
    }

    // 重做所有已识别的事务

    journal_do_redo_transactions(journal);

    return
 0;
}

数据完整性的关键保证

1. 顺序写入保证(Write Ordering)

文件系统必须按正确的顺序写入数据和元数据, 利用内存屏障保证:

// 伪代码演示关键的写入顺序
void
 write_with_ordering(struct buffer_head *meta, struct buffer_head *data) {
    // 1. 先写用户数据(在ordered模式下)

    write_buffer(data);
    smp_wmb();  // 内存写屏障, 保证前面的写完成

    // 2. 再写元数据(元数据进日志)

    journal_add_buffer(meta);
    fsync_journal();

    // 3. 最后写日志提交块

    write_commit_block();
    smp_wmb();

    // 现在即使掉电, 恢复时也能保证一致性

}

2. 校验和机制

// ext4 中的校验和计算
static
 __u32 journal_calculate_csum(transaction_t *commit_transaction) {
struct journal_head *jh;

    __u32 csum = journal->j_csum_seed;

    // 遍历事务中的所有块

    for
 (jh = commit_transaction->t_buffers; jh; jh = jh->b_tnext) {
        // 使用CRC32计算块的校验和

        csum = crc32_le(csum, (const void *)jh->b_bh->b_data, 
                        jh->b_bh->b_size);
    }

    return
 csum;
}

设计思想与架构

为什么需要 Journaling

早期的 Linux 文件系统(如 ext2)完全同步写入所有数据. 这意味着删除一个文件需要同步更新多个磁盘块, 性能极差. 而且任何时刻掉电都可能造成不一致, 需要运行耗时的 fsck 检查

Journaling 的优雅之处在于:

  • • 性能: 只需同步写入日志(顺序 I/O, 很快), 元数据回写可异步进行
  • • 可靠性: 即使频繁掉电, 也只需扫描日志恢复, 不需要全盘扫描
  • • 一致性: 通过事务模型保证原子性, 要么全部成功, 要么全不成功

各主流文件系统的方案对比

特性
ext4
Btrfs
XFS
日志类型
块级 Journaling
Copy-on-Write
文件系统 Journal
元数据保护
Journaling
CoW + 校验和
Journal
用户数据保护
可选 Data Journal
CoW
无(需配置fsync)
性能
中等
低(CoW开销)
恢复时间
秒级
无需恢复
秒级
复杂度
中等

Btrfs 的 CoW 方案: 不用日志, 而是通过 Copy-on-Write 天然保证一致性. 修改任何块前, 先写到新位置, 再更新指针. 但这引入碎片化和 RAID1 同步问题

XFS 的高性能方案: 使用日志保护元数据, 但对用户数据不保护(除非明确 fsync), 依赖文件系统级别的聚合操作保证一致性

设计权衡

Ordered vs Data Journal:

  • • Ordered 模式平衡性能和安全性, 是 ext4 默认选择
  • • Data Journal 最安全但性能损失大(日志 I/O 翻倍), 仅在对数据安全性要求极高时使用

同步 vs 异步日志:

  • • 同步日志(fsync 等待提交块写入): 安全, 但延迟大
  • • 异步日志(只等待日志空间分配): 快速, 但掉电前的少数操作可能丢失
  • • 现代系统通常用异步日志, 关键操作(如删除)再加 fsync

日志大小设置:

  • • 日志过小: 容易满, 导致频繁阻塞
  • • 日志过大: 恢复慢, 占用空间
  • • 最优值取决于工作负载, 通常为磁盘大小的 0.1% - 1%

实践示例

场景: 观察 ext4 日志操作

这个示例演示如何在实际系统上观察和验证 ext4 日志的行为

#!/bin/bash
# 1. 创建有日志的 ext4 文件系统

dd
 if=/dev/zero of=test_disk.img bs=1M count=100
mkfs.ext4 -J test_disk.img

# 2. 挂载并设置跟踪

mkdir
 -p /mnt/test
mount -o loop test_disk.img /mnt/test

# 3. 启用内核跟踪以观察日志活动

echo
 1 > /proc/sys/kernel/trace_enable
cat
 > /tmp/trace_events << 'EOF'
ext4:ext4_journal_start
ext4:ext4_journal_stop
ext4:ext4_journal_commit
EOF

while
 read event; do
    echo
 1 > /sys/kernel/debug/tracing/events/$event/enable
done
 < /tmp/trace_events

# 4. 在跟踪状态下执行文件操作

cd
 /mnt/test
touch
 testfile.txt
echo
 "hello world" > testfile.txt
rm
 testfile.txt

# 5. 查看跟踪输出

cat
 /sys/kernel/debug/tracing/trace | grep -E "ext4_journal"

预期输出解释:

  • • ext4_journal_start: 新建写操作时出现, 显示分配的 handle
  • • ext4_journal_stop: 写操作完成, handle 释放, 可能触发事务提交
  • • ext4_journal_commit: 事务被提交到日志

代码示例: 检查日志状态

#include <stdio.h>
#include <fcntl.h>

#include <sys/ioctl.h>

#include <linux/fs.h>

#include <linux/ext4_fs.h>


int
 main(int argc, char *argv[]) {
    int
 fd;
struct ext4_super_block sb;


    if
 (argc < 2) {
        fprintf
(stderr, "Usage: %s <device>\n", argv[0]);
        return
 1;
    }

    // 打开设备

    fd = open(argv[1], O_RDONLY);
    if
 (fd < 0) {
        perror("open");
        return
 1;
    }

    // 读取超级块

    lseek(fd, 1024, SEEK_SET);
    if
 (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
        perror("read superblock");
        return
 1;
    }

    // 检查日志状态

    printf
("Journal Inode: %u\n", sb.s_journal_inum);
    printf
("Journal Device: 0x%x\n", sb.s_journal_dev);
    printf
("Journal Backup: %u\n", sb.s_backup_bgs[0]);

    if
 (sb.s_feature_compat & EXT4_FEATURE_COMPAT_HAS_JOURNAL) {
        printf
("Status: Journal enabled\n");
    } else {
        printf
("Status: Journal disabled\n");
    }

    // 检查是否需要日志恢复

    if
 (sb.s_state & EXT4_ERROR_FS) {
        printf
("WARNING: Filesystem had errors, recovery needed\n");
    }

    close(fd);
    return
 0;
}

/*
编译运行: 
  gcc -o check_journal check_journal.c
  sudo ./check_journal /dev/sda1

预期输出: 
  Journal Inode: 8
  Journal Device: 0x0
  Journal Backup: 0
  Status: Journal enabled
*/

模拟日志恢复场景

#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <signal.h>

#include <sys/mman.h>


volatile
 int should_exit = 0;

void
 signal_handler(int sig) {
    should_exit = 1;
}

int
 main() {
    char
 *filename = "/tmp/journal_test.txt";
    int
 fd;
    char
 buffer[4096] = "Journal test data with intentional interruption\n";

    // 注册信号处理

    signal(SIGTERM, signal_handler);
    signal(SIGINT, signal_handler);

    fd = open(filename, O_CREAT | O_RDWR | O_TRUNC, 0644);
    if
 (fd < 0) {
        perror("open");
        return
 1;
    }

    // 模拟长时间写入

    for
 (int i = 0; i < 1000; i++) {
        if
 (should_exit) {
            printf
("Interrupted at iteration %d\n", i);
            break
;
        }

        // 多次小写入, 增加被中断的概率

        if
 (write(fd, buffer, sizeof(buffer)) < 0) {
            perror("write");
            break
;
        }

        // 每10次迭代进行一次同步

        if
 (i % 10 == 0) {
            fsync(fd);
            printf
("Checkpoint at iteration %d\n", i);
        }

        usleep(100000);  // 100ms 延迟, 留出中断机会
    }

    // 正常关闭

    fsync(fd);
    close(fd);

    // 显示文件大小

struct stat st;

    stat(filename, &st);
    printf
("Final file size: %ld bytes\n", st.st_size);

    return
 0;
}

/*
编译运行: 
  gcc -o journal_interrupt journal_interrupt.c
  ./journal_interrupt &
  sleep 2
  kill %1

结果分析: 
  - 如果接收到 SIGTERM, 程序记录中断位置
  - fsync() 确保已写数据持久化
  - 最终文件大小应该是写入的整数倍数据块
*/

工具与调试

工具/命令
用途
示例
debugfs
检查日志和 inode 信息
debugfs -R "stat <inode>" /dev/sda1
tune2fs
查看/修改日志参数
tune2fs -l /dev/sda1 | grep -i journal
e2image
备份/恢复文件系统
e2image -r /dev/sda1 backup.img
fsck.ext4
离线检查和修复
fsck.ext4 -n /dev/sda1
 (只读模式)
ftrace
跟踪内核文件系统调用
trace-cmd record -e ext4:ext4_journal_start
blktrace
跟踪块设备 I/O
blktrace -d /dev/sda1 -o - | blkparse

实用调试技巧:

# 1. 查看当前日志状态
tune2fs -l /dev/sda1 | grep -E "journal|Journal"

# 2. 强制日志恢复(卸载后)

fsck.ext4 -f /dev/sda1

# 3. 用 debugfs 查看特定 inode 的日志状态

debugfs -R "stat <12>" /dev/sda1

# 4. 实时监控日志压力

watch -n 1 'cat /proc/fs/ext4/*/mb_groups | head -20'

# 5. 禁用日志(仅用于测试)

tune2fs -O ^has_journal /dev/sda1

# 6. 使用 strace 跟踪系统调用

strace -e openat,write,fsync,fallocate -f dd if=/dev/zero of=/tmp/test.img bs=1M count=100

架构总览

分层说明:

  1. 1. 应用层: 用户程序发起 write/fsync/unlink 等系统调用
  2. 2. VFS层: 通用虚拟文件系统接口, 屏蔽文件系统差异
  3. 3. 文件系统层: ext4 特定逻辑, 处理 Journaling、extent、位图
  4. 4. 缓冲区层: 内存缓冲管理, 决定何时真正写入磁盘
  5. 5. 块设备层: 与硬件交互, 管理 I/O 队列和调度

数据流:

  • • 写入路径: 应用 → VFS → ext4 → Journal → Buffer Cache → 磁盘
  • • 恢复路径: 掉电后 → 扫描日志 → 重做已提交事务 → 系统可用

全文总结

Linux 文件系统一致性问题是一个经典的工程难题, 涉及多个层面的权衡:

维度
挑战
解决方案
可靠性
掉电/崩溃导致数据不一致
Journaling 记录操作日志, 宕机后快速恢复
性能
同步写入效率太低
异步日志 + 定期 checkpoint, 日志只记录元数据
复杂性
并发事务管理困难
Handle 计数模型允许多个进程并发修改同一事务
正确性
元数据和数据顺序错乱
写入顺序保证 + 内存屏障 + 校验和

关键洞察:

  1. 1. 最小原子单位: 事务而非单个操作, 通过日志保证原子性
  2. 2. 异步回写: 日志只记录变更, 真实回写可延迟, 大幅提升性能
  3. 3. 快速恢复: 不需要扫描全盘, 只扫描日志, 秒级恢复
  4. 4. 隔离设计: 日志区和数据区隔离, 降低相互干扰

虽然 Journaling 增加了复杂性, 但为现代文件系统带来了既可靠又高效的设计. 理解这些机制, 不仅能帮助你配置更安全的存储系统, 也能在性能调优时做出更明智的决策. 比如在嵌入式系统中, 你可能会禁用日志以节省空间;而在关键业务系统中, 可以启用 Data Journal 模式以获得最高的数据保护等级

最新文章

随机文章

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