当前位置:首页>Linux>Linux Select 工作原理深度剖析: 从设计思想到实现细节

Linux Select 工作原理深度剖析: 从设计思想到实现细节

  • 2026-01-09 18:48:24
Linux Select 工作原理深度剖析: 从设计思想到实现细节

Linux Select 工作原理深度剖析: 从设计思想到实现细节

一、为什么需要 I/O 多路复用?

想象一下你是一个餐厅的服务员. 在传统的阻塞 I/O 模型中, 你就像是一个专属服务员——为每张桌子(文件描述符)配备一个服务员(线程/进程), 这个服务员必须一直站在桌子旁等待客人点餐(数据就绪), 期间不能做其他任何事情

// 传统阻塞 I/O 模型的问题while (1) {    // 每个连接都需要单独的线程/进程    data = read(socket_fd);  // 阻塞在这里, 什么都干不了    process(data);}

这种模型在并发连接数增多时, 资源消耗巨大. 而 I/O 多路复用就像是一个高效的服务员主管, 他可以同时监听多个桌子的需求, 只有当某张桌子准备好点餐时, 才派服务员过去处理

二、Select 的设计哲学: 简单即美

2.1 核心设计思想

Select 的设计遵循 UNIX 的「一切皆文件」哲学. 它将所有 I/O 操作抽象为对文件描述符的操作, 通过同步轮询的方式监控多个文件描述符的状态变化

2.2 生活中的比喻

把 select 想象成一个邮件收发室的监控系统:

  • • 每个文件描述符就像是一个邮箱
  • • fd_set 就像是邮箱列表
  • • select 就像是定时巡查的邮递员
  • • timeout 就像是巡查的时间间隔

三、核心数据结构深入解析

3.1 fd_set: 位图的精妙设计

/* fd_set 在 glibc 中的定义(简化版) */#define __FD_SETSIZE    1024#define __NFDBITS       (8 * (int) sizeof (__fd_mask))typedefstruct {    __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS];} fd_set;/* 关键宏定义 */#define FD_SET(fd, fdsetp) \    ((fdsetp)->fds_bits[(fd) / __NFDBITS] |= (1UL << ((fd) % __NFDBITS)))#define FD_CLR(fd, fdsetp) \    ((fdsetp)->fds_bits[(fd) / __NFDBITS] &= ~(1UL << ((fd) % __NFDBITS)))#define FD_ISSET(fd, fdsetp) \    (((fdsetp)->fds_bits[(fd) / __NFDBITS] & (1UL << ((fd) % __NFDBITS))) != 0)#define FD_ZERO(fdsetp) \    memset((fdsetp), 0, sizeof(*(fdsetp)))

**位图的存储结构: **

3.2 为什么使用位图?

特点
优势
劣势
空间效率
1024个fd只需128字节
固定大小, 不能动态扩展
操作速度
位操作是CPU指令级优化
线性遍历, O(n)复杂度
API简洁
简单的宏定义接口
需要手动管理大小
内核友好
复制到内核空间成本低
往返复制造成开销

四、Select 系统调用实现机制

4.1 系统调用原型

#include <sys/select.h>int select(int nfds,            fd_set *readfds,            fd_set *writefds,           fd_set *exceptfds,           struct timeval *timeout);// 参数详解: // nfds: 监控的最大文件描述符值+1(优化遍历范围)// readfds: 监控读就绪的文件描述符集合// writefds: 监控写就绪的文件描述符集合// exceptfds: 监控异常的文件描述符集合// timeout: 超时时间, NULL表示阻塞, 0表示非阻塞

4.2 内核实现流程

// Linux 内核 select 实现的核心逻辑(简化版)SYSCALL_DEFINE5(select, int, n,                 fd_set __user *, inp,                 fd_set __user *, outp,                fd_set __user *, exp,                struct timeval __user *, tvp){struct timespec end_time, *to = NULL;    fd_set_bits fds;    // 1. 超时时间处理    if (tvp) {        time_t sec = tvp->tv_sec;        suseconds_t usec = tvp->tv_usec;        // 转换为内核时间格式...    }    // 2. 从用户空间复制 fd_set    ret = core_sys_select(n, inp, outp, exp, to, &fds);    // 3. 核心轮询逻辑    ret = do_select(n, &fds, to);    // 4. 将结果复制回用户空间    if (set_fd_set(n, inp, fds.res_in) ||        set_fd_set(n, outp, fds.res_out) ||        set_fd_set(n, exp, fds.res_ex))        ret = -EFAULT;    return ret;}

4.3 关键数据结构关系

五、Select 工作流程详细剖析

5.1 用户空间准备阶段

// 典型的使用模式int main() {    fd_set readfds;struct timeval tv;    int max_fd = 0;    // 初始化 fd_set    FD_ZERO(&readfds);    // 添加标准输入    FD_SET(STDIN_FILENO, &readfds);    max_fd = STDIN_FILENO;    // 添加socket描述符    int sock_fd = socket(AF_INET, SOCK_STREAM, 0);    FD_SET(sock_fd, &readfds);    if (sock_fd > max_fd) max_fd = sock_fd;    // 设置超时时间    tv.tv_sec = 5;    tv.tv_usec = 0;    // 调用select    int ret = select(max_fd + 1, &readfds, NULL, NULL, &tv);    // 检查结果    if (FD_ISSET(STDIN_FILENO, &readfds)) {        // 处理标准输入    }    if (FD_ISSET(sock_fd, &readfds)) {        // 处理socket数据    }    return 0;}

5.2 内核空间处理流程

// 内核 do_select 核心逻辑(极度简化)static int do_select(int n, fd_set_bits *fds, struct timespec *end_time){    poll_table *wait;    int retval = 0;    // 初始化等待队列    poll_initwait(&table);    wait = &table.pt;    for (;;) {        unsigned long *rinp, *routp, *rexp;        // 设置需要监控的事件类型        wait->_key = POLLIN_SET | POLLOUT_SET | POLLEX_SET;        // 遍历所有文件描述符        for (i = 0; i < n; ++i) {struct file *file;            // 获取文件指针            file = fget(i);            if (file) {                // 调用底层驱动的poll方法                mask = file->f_op->poll(file, wait);                // 根据返回结果设置位图                if (mask & (POLLIN | POLLRDNORM))                    set_bit(i, fds->res_in);                if (mask & (POLLOUT | POLLWRNORM))                    set_bit(i, fds->res_out);                if (mask & (POLLERR | POLLHUP))                    set_bit(i, fds->res_ex);                fput(file);            }        }        // 如果有就绪fd或超时或信号中断, 则退出        if (retval || timed_out || signal_pending(current))            break;        // 否则, 让出CPU, 等待被唤醒        wait->_qproc = NULL;        schedule();    }    poll_freewait(&table);    return retval;}

六、Select 的局限性分析

6.1 性能瓶颈分析

**双重遍历造成的 O(n²) 时间复杂度: **

阶段
时间复杂度
具体操作
用户→内核复制
O(n)
复制整个fd_set
内核遍历检查
O(n)
遍历每个文件描述符
内核→用户复制
O(n)
复制结果回用户空间
用户遍历结果
O(n)
检查每个fd的就绪状态
总复杂度O(n)
但隐藏常数很大

6.2 Select 的硬伤

  1. 1. 文件描述符数量限制
    • • 默认1024(可通过重新编译内核修改, 但有限制)
    • • 每个进程能打开的最大文件数受系统限制
  2. 2. 内存复制开销
    // 每次调用都需要完整的复制过程select(..., &readfds, ...);  // 用户空间->内核空间// 内核修改后// 内核空间->用户空间
  3. 3. 线性扫描效率低
    • • 无论有多少活跃连接, 都需要遍历所有fd
    • • 随着连接数增加, 性能急剧下降

七、实战示例: 简易 TCP 服务器

7.1 完整实现代码

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <sys/select.h>#include <netinet/in.h>#include <arpa/inet.h>#define MAX_CLIENTS 1024#define BUFFER_SIZE 1024int main(int argc, char *argv[]) {    int server_fd, max_fd, activity, i, new_socket;    int client_sockets[MAX_CLIENTS] = {0};    fd_set readfds;    char buffer[BUFFER_SIZE];struct sockaddr_in address;    int addrlen = sizeof(address);    // 创建服务器socket    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {        perror("socket failed");        exit(EXIT_FAILURE);    }    // 设置socket选项    int opt = 1;    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR,                    &opt, sizeof(opt))) {        perror("setsockopt");        exit(EXIT_FAILURE);    }    // 绑定地址和端口    address.sin_family = AF_INET;    address.sin_addr.s_addr = INADDR_ANY;    address.sin_port = htons(8080);    if (bind(server_fd, (struct sockaddr *)&address,             sizeof(address)) < 0) {        perror("bind failed");        exit(EXIT_FAILURE);    }    // 开始监听    if (listen(server_fd, 3) < 0) {        perror("listen");        exit(EXIT_FAILURE);    }    printf("Server started on port 8080\n");    while (1) {        // 清空fd_set        FD_ZERO(&readfds);        // 添加服务器socket到监控集合        FD_SET(server_fd, &readfds);        max_fd = server_fd;        // 添加所有客户端socket到监控集合        for (i = 0; i < MAX_CLIENTS; i++) {            int sd = client_sockets[i];            if (sd > 0) {                FD_SET(sd, &readfds);            }            if (sd > max_fd) {                max_fd = sd;            }        }        // 调用select, 等待活动发生        activity = select(max_fd + 1, &readfds, NULL, NULL, NULL);        if ((activity < 0) && (errno != EINTR)) {            perror("select error");        }        // 检查服务器socket是否有新连接        if (FD_ISSET(server_fd, &readfds)) {            if ((new_socket = accept(server_fd,                                     (struct sockaddr *)&address,                                     (socklen_t*)&addrlen)) < 0) {                perror("accept");                exit(EXIT_FAILURE);            }            printf("New connection from %s:%d\n"                   inet_ntoa(address.sin_addr),                    ntohs(address.sin_port));            // 添加新socket到数组            for (i = 0; i < MAX_CLIENTS; i++) {                if (client_sockets[i] == 0) {                    client_sockets[i] = new_socket;                    printf("Adding to list of sockets as %d\n", i);                    break;                }            }        }        // 检查客户端socket的数据        for (i = 0; i < MAX_CLIENTS; i++) {            int sd = client_sockets[i];            if (FD_ISSET(sd, &readfds)) {                // 读取数据                int valread = read(sd, buffer, BUFFER_SIZE);                if (valread == 0) {                    // 客户端断开连接                    getpeername(sd, (struct sockaddr*)&address,                                (socklen_t*)&addrlen);                    printf("Host disconnected, ip %s, port %d\n",                          inet_ntoa(address.sin_addr),                           ntohs(address.sin_port));                    close(sd);                    client_sockets[i] = 0;                } else {                    // 回显数据                    buffer[valread] = '\0';                    send(sd, buffer, strlen(buffer), 0);                }            }        }    }    return 0;}

7.2 执行流程图

八、调试和性能分析工具

8.1 系统调用跟踪

# 使用 strace 跟踪 select 调用strace -e trace=network,select -f ./select_server# 输出示例: # select(6, [3 5], NULL, NULL, NULL) = 1 (in [5])# select(6, [3 5], NULL, NULL, {tv_sec=5, tv_usec=0}) = 0 (Timeout)

8.2 性能分析命令

# 查看进程打开的文件描述符ls -la /proc/<pid>/fd/# 监控系统调用统计sudo perf trace -p <pid># 查看select调用次数sudo perf stat -e 'syscalls:sys_enter_select*' ./server# 使用bpftrace监控selectsudo bpftrace -e 'tracepoint:syscalls:sys_enter_select {    printf("select called by PID %d\n", pid);}'

8.3 调试技巧表格

调试场景
工具/方法
具体命令/步骤
select阻塞问题
strace + gdb
strace -p <pid>
gdb -p <pid>
fd_set状态检查
自定义调试输出
打印fd_set的位图
性能瓶颈分析
perf + flamegraph
perf record -g
perf report
内存泄漏检查
valgrind
valgrind --leak-check=full ./server
竞争条件调试
日志+断言
添加详细的日志输出

九、Select 与其他多路复用技术对比

9.1 技术参数对比

特性
select
poll
epoll (Linux)
kqueue (BSD)
时间复杂度
O(n)
O(n)
O(1)
O(1)
最大连接数
FD_SETSIZE(1024)
无限制
系统限制
系统限制
内存复制
每次调用复制全部
每次调用复制全部
内存共享
内存共享
触发模式
水平触发
水平触发
水平/边缘触发
水平/边缘触发
内核实现
轮询所有fd
轮询所有fd
回调通知
回调通知
跨平台性
几乎所有系统
几乎所有系统
Linux特有
BSD特有
适用场景
小规模并发
中等规模并发
大规模并发
大规模并发

9.2 选择策略决策树

十、现代系统中的 Select

10.1 为什么 select 仍在被使用?

尽管 select 有诸多限制, 但在某些场景下仍然是合理的选择:

  1. 1. 简单原型开发
    // 快速验证想法fd_set fds;FD_ZERO(&fds);FD_SET(0, &fds);  // 标准输入FD_SET(sock, &fds);  // 一个socketselect(sock+1, &fds, NULL, NULL, NULL);
  2. 2. 跨平台兼容性
    • • Windows 的 Winsock 也支持 select
    • • 嵌入式系统的轻量级需求
    • • 教学和示例代码
  3. 3. 监控少量文件描述符
    • • 当只需要监控几个文件描述符时
    • • select 的开销可以忽略不计

10.2 Select 的现代替代方案

// 使用更现代的 poll() 接口struct pollfd fds[2];fds[0].fd = STDIN_FILENO;fds[0].events = POLLIN;fds[1].fd = sock_fd;fds[1].events = POLLIN;int ret = poll(fds, 2, 5000);  // 5秒超时// 或者使用 epoll(Linux专有)int epoll_fd = epoll_create1(0);struct epoll_event event, events[MAX_EVENTS];event.events = EPOLLIN;event.data.fd = sock_fd;epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock_fd, &event);int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);

十一、总结

11.1 Select 的核心要点回顾

  1. 1. 设计哲学:
    • • 简单统一的文件描述符抽象
    • • 同步阻塞的轮询模型
    • • 位图数据结构的巧妙应用
  2. 2. 工作流程
    用户空间准备fd_set → 系统调用进入内核 → 内核复制数据 → 遍历所有fd调用poll → 等待或返回 → 结果复制回用户空间 → 用户遍历检查结果
  3. 3. 性能特点:
    • • 连接数少时性能可接受
    • • 连接数多时性能急剧下降
    • • 内存复制和双重遍历是主要瓶颈

11.2 最佳实践建议

场景
推荐方案
理由
教学示例
select
概念简单, 易于理解
跨平台工具
select
兼容性最好
监控<10个fd
select
简单够用
中等规模服务器
poll
无连接数限制
高性能服务器
epoll/kqueue
最佳性能
实时系统
考虑专用方案
确定性要求高

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 23:05:04 HTTP/2.0 GET : https://f.mffb.com.cn/a/460989.html
  2. 运行时间 : 0.094403s [ 吞吐率:10.59req/s ] 内存消耗:4,581.96kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=cc2602105a7149ab5b69588428285f9b
  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.000554s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000699s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000682s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000627s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000499s ]
  6. SELECT * FROM `set` [ RunTime:0.000189s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000501s ]
  8. SELECT * FROM `article` WHERE `id` = 460989 LIMIT 1 [ RunTime:0.000508s ]
  9. UPDATE `article` SET `lasttime` = 1770563105 WHERE `id` = 460989 [ RunTime:0.004403s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000222s ]
  11. SELECT * FROM `article` WHERE `id` < 460989 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000387s ]
  12. SELECT * FROM `article` WHERE `id` > 460989 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000771s ]
  13. SELECT * FROM `article` WHERE `id` < 460989 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001826s ]
  14. SELECT * FROM `article` WHERE `id` < 460989 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.011802s ]
  15. SELECT * FROM `article` WHERE `id` < 460989 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002430s ]
0.096075s