当前位置:首页>Linux>Linux内核轮询操作深度解析

Linux内核轮询操作深度解析

  • 2026-02-25 04:08:45
Linux内核轮询操作深度解析

在Linux系统开发中,I/O多路复用是解决高并发、高效I/O的核心技术之一,而轮询(Polling)作为I/O多路复用的基础实现方式,贯穿了应用程序与设备驱动的整个交互流程。从早期的select、poll系统调用,到后来为高并发场景优化的epoll,轮询机制一直在随着内核迭代不断演进。本文将基于Linux 6.6内核,结合附件中的核心知识点,全面拆解轮询操作的概念、应用层编程、驱动层实现,以及内核中的关键优化,帮你吃透轮询的底层逻辑与实操要点。

一、轮询的核心定位:解决I/O阻塞与非阻塞的痛点

在Linux设备访问中,阻塞I/O会导致进程挂起,直到设备就绪;而非阻塞I/O虽不会挂起进程,却需要应用程序不断循环查询设备状态,造成CPU资源浪费。轮询机制恰好解决了这一矛盾——它允许应用程序同时监控多个文件描述符(fd),等待其中任意一个或多个fd就绪(可读、可写或异常),再进行后续I/O操作,本质是“主动查询+阻塞等待”的结合体,实现了CPU资源与I/O效率的平衡。

Linux中的轮询机制主要依赖三类系统调用:select、poll、epoll。其中select源自BSD UNIX,poll源自System V,两者本质逻辑一致;epoll则是Linux 2.5.45内核引入的扩展版本,在Linux 6.6内核中经过多轮优化,成为高并发场景(如服务器开发)的首选方案。需要注意的是,无论应用层调用哪种轮询系统调用,最终都会触发设备驱动中的poll()函数,完成底层设备状态的查询与等待队列的管理。

从I/O演进的视角来看,轮询是从“CPU忙等”到“高效等待”的关键一步——它摆脱了非阻塞I/O的无效循环,同时避免了阻塞I/O对单个fd的依赖,让单线程或少量线程就能高效管理多个I/O任务,这也是Nginx等高性能服务器的核心实现基础之一。

二、应用层轮询编程:select、poll与epoll实操(Linux 6.6适配)

应用层轮询编程的核心是通过系统调用,向内核注册需要监控的fd及事件类型,等待内核返回就绪事件后再处理。Linux 6.6内核完全兼容传统的select、poll调用,同时对epoll进行了性能优化(如减少锁竞争、优化就绪队列遍历),下面结合实操细节与内核特性,逐一拆解三类调用的使用方式与注意事项。

2.1 select:最基础的多路复用调用

select是最古老的轮询系统调用,其核心是通过位图(fd_set)管理需要监控的fd,支持同时监控读、写、异常三类事件。在Linux 6.6内核中,select的底层实现虽未发生根本性变化,但针对fd_set的拷贝效率进行了小幅优化,不过其固有的局限性(fd数量限制、效率随fd增多下降)仍未改变。

select函数原型(与附件一致,Linux 6.6完全兼容):

intselect(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

关键参数解析:

  • numfds:需要监控的最大fd值+1(因为fd是从0开始计数的,内核需遍历到最大fd);

  • readfds/writefds/exceptfds:分别是可读、可写、异常事件的fd集合,传入NULL表示不监控该类事件;

  • timeout:超时时间,NULL表示永久等待,非NULL则表示等待指定时间后超时返回(单位:秒+微秒)。

使用select时,需借助四个宏操作fd_set集合(Linux 6.6内核中宏定义未变):

  • FD_ZERO(fd_set *set):清空fd集合;

  • FD_SET(int fd, fd_set *set):将指定fd加入集合;

  • FD_CLR(int fd, fd_set *set):将指定fd从集合中移除;

  • FD_ISSET(int fd, fd_set *set):判断fd是否在就绪集合中。

核心工作流程(结合Linux 6.6内核逻辑):

  1. 应用程序初始化fd_set集合,添加需要监控的fd;

  2. 调用select,内核将fd_set从用户态拷贝到内核态,遍历所有监控的fd,检查其状态;

  3. 若有任意fd就绪(如readfds中的fd有数据可读),内核修改fd_set,标记就绪fd,将fd_set拷贝回用户态,select返回就绪fd数量;

  4. 若没有fd就绪,进程阻塞睡眠,被添加到所有监控fd对应的设备等待队列中,直到有设备就绪或超时,内核唤醒进程并返回。

注意点:Linux 6.6中,select的fd数量仍受限于FD_SETSIZE(默认1024),且每次调用都需重新初始化fd_set(因为内核会修改集合内容),适合fd数量较少的简单场景(如小型客户端程序)。

2.2 poll:select的补丁式升级

poll是为解决select的fd数量限制而设计的,它放弃了select的位图机制,改用结构体数组(struct pollfd)管理fd,在Linux 6.6内核中,其核心逻辑与早期版本一致,但内核对结构体数组的遍历效率进行了优化,支持更多fd的监控。

poll函数原型(Linux 6.6兼容):

intpoll(struct pollfd *fds, nfds_t nfds, int timeout);

核心改进:struct pollfd结构体单独描述每个fd的监控事件与就绪状态,无需像select那样维护三个fd集合,且fd数量仅受系统资源限制(无固定上限)。struct pollfd的核心字段如下(简化版):

structpollfd {int fd;         // 需要监控的文件描述符    short events;   // 注册的监控事件(如POLLIN、POLLOUT)    short revents;  // 实际就绪的事件(由内核填充)};

poll的优势的是突破了fd数量限制,且无需像select那样每次调用都重新设置fd集合(revents由内核覆盖,events保持不变);但它与select存在同样的核心缺陷——每次调用都需内核遍历所有注册的fd,效率随fd数量增多而下降(时间复杂度O(n)),因此仍不适合高并发场景。

2.3 epoll:Linux 6.6高并发首选

epoll是Linux特有的轮询机制,专为高并发场景设计,其核心优势是“不会随fd数量增长而降低效率”——内核通过红黑树管理注册的fd,就绪队列存储就绪fd,实现了“注册一次、多次复用”,时间复杂度优化为O(1)。在Linux 6.6内核中,epoll进一步优化了锁机制(减少多核场景下的锁竞争)和就绪队列的遍历效率,同时完善了边缘触发(ET)模式的稳定性,成为大规模并发服务器(如Nginx、Redis)的首选方案。

epoll的应用层编程需用到三个核心系统调用,Linux 6.6内核中均保持兼容,且推荐使用epoll_create1(epoll_create的改进版,支持设置标志位)替代传统的epoll_create。

(1)epoll_create:创建epoll句柄

intepoll_create(int size);

关键说明:Linux 6.6中,size参数已成为历史遗留项(仅用于向后兼容),无需传递准确值,只需传递一个大于0的整数即可。创建成功后,epoll句柄本身会占用一个fd,因此使用完毕后必须调用close()关闭,避免fd泄露。

推荐使用epoll_create1,支持设置EPOLL_CLOEXEC标志,确保进程退出时自动关闭epoll句柄,减少资源泄露风险:

intepoll_create1(int flags);

(2)epoll_ctl:注册/修改/删除监控事件

intepoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

参数解析(Linux 6.6无差异):

  • epfd:epoll_create的返回值(epoll句柄);

  • op:操作类型,包括EPOLL_CTL_ADD(注册fd)、EPOLL_CTL_MOD(修改fd监控事件)、EPOLL_CTL_DEL(删除fd);

  • fd:需要监控的文件描述符;

  • event:监控的事件类型,struct epoll_event结构体定义如下:

structepoll_event {__uint32_t events;  // 监控的事件(宏的“或”组合)epoll_data_t data;  // 用户自定义数据(如fd的标识)};

常用events宏(Linux 6.6完全兼容,补充核心说明):

  • EPOLLIN:fd可读(如socket接收队列有数据、文件有数据可读取);

  • EPOLLOUT:fd可写(如socket发送缓冲区有空闲、文件可写入数据);

  • EPOLLPRI:fd有紧急数据可读(如socket带外数据);

  • EPOLLERR:fd发生错误(内核自动监控,无需主动注册);

  • EPOLLH:fd被挂断(如TCP连接关闭);

  • EPOLLET:边缘触发模式(Linux 6.6优化重点),仅在fd状态从“未就绪”变为“就绪”时通知一次,需配合非阻塞I/O使用,效率更高;

  • EPOLLONESHOT:一次性监控,事件触发后自动取消监控,需重新注册才能再次监控;

  • EPOLLEXCLUSIVE:Linux 4.5+引入(Linux 6.6完善),解决惊群效应,确保多个进程/线程监控同一fd时,仅一个被唤醒。

(3)epoll_wait:等待就绪事件

intepoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

参数解析(Linux 6.6补充优化点):

  • events:输出参数,内核将就绪事件填充到该数组中,应用程序遍历处理;

  • maxevents:最多接收的就绪事件数,不能大于epoll_create时的size(Linux 6.6中可动态调整,无需严格匹配);

  • timeout:超时时间(毫秒),0表示立即返回,-1表示永久等待,正数表示等待指定毫秒数;

  • 返回值:就绪事件的数量,0表示超时,-1表示出错。

Linux 6.6中epoll的核心优化:

  • 减少锁竞争:多核场景下,epoll的就绪队列采用无锁设计,避免多个CPU核心同时操作时的锁阻塞;

  • 优化ET模式:修复了早期版本中ET模式下的事件丢失问题,确保fd状态变化时能稳定触发通知,同时优化了循环读取/写入的效率;

  • 惊群效应优化:通过EPOLLEXCLUSIVE标志,配合内核的调度优化,减少多进程/线程监控同一fd时的无效唤醒,提升高并发场景下的吞吐量。

2.4 三类轮询调用对比(Linux 6.6场景)

结合Linux 6.6内核特性,整理三类轮询调用的核心差异,方便开发者选型:

  • select:兼容所有POSIX系统,实现简单,适合fd数量少(<1024)、并发低的场景,缺点是fd数量受限、效率随fd增多下降;

  • poll:突破fd数量限制,无需重新初始化fd集合,适合fd数量中等、跨平台需求低的场景,缺点是效率随fd增多下降,仍存在盲轮询问题;

  • epoll:Linux专属,效率不随fd数量变化,支持ET模式和惊群优化,适合高并发、fd数量多(如万级、十万级)的场景(如服务器),缺点是不支持跨平台。

补充:根据内核文档《Comparing and Evaluating epoll,select,and poll Event Mechanisms》的测试结果,在Linux 6.6内核中,当fd数量超过1000时,epoll的吞吐量是select/poll的5倍以上,且fd数量越多,epoll的优势越明显。

三、驱动层轮询编程:poll()函数实现(Linux 6.6适配)

应用层调用select、poll、epoll时,内核最终都会调用对应设备驱动中的poll()函数——驱动层的poll()函数核心作用是:将进程添加到设备的等待队列中,同时返回设备的就绪状态掩码,告知内核该设备是否可读、可写。

Linux 6.6内核中,设备驱动的poll()函数原型与附件一致,无本质变化,但内核对poll_wait()函数的底层实现进行了优化,减少了等待队列的操作开销,提升了进程唤醒效率。

3.1 驱动poll()函数原型与核心职责

unsignedint(*poll)(struct file *filp, struct poll_table_struct *wait);

参数解析:

  • filp:文件结构体指针,指向当前打开的设备文件;

  • wait:轮询表指针,用于注册设备的等待队列,让内核知道该进程需要等待哪个设备的就绪事件。

poll()函数的两大核心职责(必须实现):

  1. 调用poll_wait()函数,将进程添加到设备的等待队列中(读等待队列、写等待队列),确保设备就绪时能唤醒进程;

  2. 返回设备的就绪状态掩码,由POLLIN、POLLOUT等宏组合而成,告知内核设备当前是否可读、可写。

3.2 关键函数:poll_wait()详解(避坑重点)

很多开发者会误解poll_wait()函数的作用——认为它会阻塞进程,但实际上,poll_wait()函数不会引起进程阻塞,其核心作用是“注册等待队列”,将当前进程添加到poll_table(轮询表)中,同时将设备的等待队列头部关联到poll_table,让设备就绪时(如收到数据)能通过等待队列唤醒该进程。

poll_wait()函数原型(Linux 6.6无变化):

voidpoll_wait(struct file *filp, wait_queue_head_t *queue, struct poll_table_struct *wait);

参数解析:

  • filp:当前设备文件的file指针;

  • queue:设备的等待队列头部(如读等待队列r_wait、写等待队列w_wait);

  • wait:轮询表指针,来自poll()函数的参数。

Linux 6.6中poll_wait()的优化点:底层采用链表管理等待队列,减少了进程添加/移除时的链表遍历开销,同时支持批量唤醒,提升了多进程等待同一设备时的唤醒效率。

3.3 驱动poll()函数实战模板(Linux 6.6兼容)

结合附件中的模板,补充Linux 6.6内核下的最佳实践,完善错误处理与注释,适合直接嵌入驱动代码中使用:

// 假设设备结构体已定义,包含读/写等待队列structxxx_dev {structcdevcdev;// 字符设备结构体wait_queue_head_t r_wait;  // 读等待队列头部wait_queue_head_t w_wait;  // 写等待队列头部char buf[1024];            // 设备缓冲区int len;                   // 缓冲区数据长度(用于判断是否可读)int write_flag;            // 写就绪标志(用于判断是否可写)};// 驱动poll()函数实现staticunsignedintxxx_poll(struct file *filp, struct poll_table_struct *wait){unsignedint mask = 0;structxxx_dev *dev = filp->private_data;// 从file指针获取设备结构体// 1. 注册等待队列:将进程添加到读/写等待队列,关联轮询表    poll_wait(filp, &dev->r_wait, wait);  // 注册读等待队列    poll_wait(filp, &dev->w_wait, wait);  // 注册写等待队列// 2. 判断设备就绪状态,设置对应的掩码// 可读:缓冲区有数据(len > 0)if (dev->len > 0) {        mask |= POLLIN | POLLRDNORM;  // POLLRDNORM表示常规可读事件    }// 可写:缓冲区未满(假设缓冲区大小为1024,len < 1024)if (dev->len < 1024) {        mask |= POLLOUT | POLLWRNORM;  // POLLWRNORM表示常规可写事件    }// 异常状态:可根据实际需求添加(如设备错误)if (dev->error_flag) {        mask |= POLLERR;    }// 3. 返回就绪状态掩码,告知内核设备当前状态return mask;}

关键说明(Linux 6.6适配):

  • 等待队列初始化:在设备probe()函数中,需通过init_waitqueue_head()初始化r_wait和w_wait,确保poll_wait()能正常注册;

  • 就绪状态判断:需结合设备实际逻辑(如缓冲区状态、硬件寄存器状态),避免误判;

  • 掩码组合:POLLIN与POLLRDNORM、POLLOUT与POLLWRNORM可组合使用,确保内核能正确识别常规I/O事件,Linux 6.6内核对这两类宏的处理完全兼容早期版本。

四、Linux 6.6内核轮询机制优化要点总结

相比早期内核,Linux 6.6对轮询机制的优化主要集中在性能提升与稳定性增强,核心要点如下,帮助开发者理解内核底层逻辑,更好地进行选型与优化:

  1. epoll优化:重点优化了锁竞争与就绪队列遍历,采用无锁设计提升多核场景性能,完善ET模式稳定性,通过EPOLLEXCLUSIVE标志优化惊群效应,适合高并发场景;

  2. select/poll优化:小幅优化了fd集合/结构体数组的拷贝效率,未改变核心逻辑,保持向后兼容,适合遗留项目或简单场景;

  3. 驱动层优化:poll_wait()函数底层优化,减少等待队列操作开销,支持批量唤醒,提升多进程等待时的效率;

  4. 资源管理优化:内核对epoll句柄、等待队列的资源回收机制进行了完善,减少fd泄露、资源浪费的风险。

五、实战避坑指南(高频问题+解决方案)

结合Linux 6.6内核特性与实际开发经验,整理轮询编程中最常见的4个问题,给出针对性解决方案,帮你避开踩坑:

坑1:epoll句柄未关闭,导致fd泄露

问题现象:应用程序长期运行后,fd数量不断增加,最终提示“too many open files”;

解决方案:epoll_create创建的句柄本身是一个fd,使用完毕后(如程序退出、不再需要监控fd时),必须调用close(epfd)关闭,推荐使用epoll_create1设置EPOLL_CLOEXEC标志,双重保障。

坑2:ET模式下未循环读取/写入,导致数据丢失

问题现象:epoll仅通知一次可读/可写事件,应用程序读取/写入部分数据后,剩余数据未处理,且后续不再收到通知;

解决方案:ET模式下,fd必须设置为非阻塞(O_NONBLOCK),且需循环调用read/write,直到返回EAGAIN/EWOULDBLOCK(表示当前无更多数据/无空闲缓冲区),确保数据处理完毕。

坑3:驱动poll()函数未注册等待队列,导致进程无法被唤醒

问题现象:应用层调用select/poll/epoll后,进程一直阻塞,即使设备就绪也无法唤醒;

解决方案:驱动poll()函数中,必须调用poll_wait()函数,将进程添加到设备的等待队列中,同时确保设备就绪时(如收到数据),调用wake_up_interruptible()唤醒等待队列中的进程。

坑4:select的numfds参数设置错误,导致监控失效

问题现象:部分fd未被监控,即使就绪也不会触发select返回;

解决方案:numfds必须设置为“监控的最大fd值+1”,例如监控的fd为3、5、7,numfds需设置为8,否则内核会忽略大于等于numfds的fd。

六、总结

轮询机制是Linux I/O多路复用的核心,从select、poll的基础实现,到epoll的高并发优化,其演进逻辑始终围绕“提升效率、减少资源浪费”。Linux 6.6内核进一步强化了epoll的性能与稳定性,同时保持了对传统轮询调用的兼容,让开发者既能兼顾遗留项目,也能开发高性能的高并发应用。

本文结合附件中的核心知识点,从应用层编程、驱动层实现、内核优化三个维度,拆解了Linux 6.6内核下的轮询操作,同时补充了实战模板与避坑指南。核心要点总结:

  • 选型建议:低并发、fd少用select,中等并发用poll,高并发、Linux专属场景用epoll;

  • 驱动实现:poll()函数必须完成“注册等待队列+返回就绪掩码”两大职责,避免遗漏;

  • 内核特性:重点关注Linux 6.6的epoll优化,合理使用ET模式与EPOLLEXCLUSIVE标志,提升应用性能。

轮询编程的核心是理解“内核与应用层的交互逻辑”——应用层负责注册监控需求,内核负责管理fd与等待队列,驱动层负责反馈设备状态,三者协同工作,才能实现高效的I/O多路复用。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-28 10:48:02 HTTP/2.0 GET : https://f.mffb.com.cn/a/476459.html
  2. 运行时间 : 0.167685s [ 吞吐率:5.96req/s ] 内存消耗:4,898.89kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=369afdb66384b5afec494db19d3e5efb
  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.000637s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000877s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000356s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000297s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000627s ]
  6. SELECT * FROM `set` [ RunTime:0.000197s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000607s ]
  8. SELECT * FROM `article` WHERE `id` = 476459 LIMIT 1 [ RunTime:0.001238s ]
  9. UPDATE `article` SET `lasttime` = 1772246883 WHERE `id` = 476459 [ RunTime:0.003786s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000442s ]
  11. SELECT * FROM `article` WHERE `id` < 476459 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000589s ]
  12. SELECT * FROM `article` WHERE `id` > 476459 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000980s ]
  13. SELECT * FROM `article` WHERE `id` < 476459 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004841s ]
  14. SELECT * FROM `article` WHERE `id` < 476459 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003167s ]
  15. SELECT * FROM `article` WHERE `id` < 476459 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.029881s ]
0.169313s