当前位置:首页>Linux>笑不活了!Linux IO多路复用,竟是“快递站的全能调度员”

笑不活了!Linux IO多路复用,竟是“快递站的全能调度员”

  • 2026-04-16 07:07:04
笑不活了!Linux IO多路复用,竟是“快递站的全能调度员”

点击蓝字

关注我们

笑不活了!Linux IO多路复用,竟是“快递站的全能调度员”

新手必看|告别“单线程忙死”,通俗讲透select/poll/epoll,马年轻松拿捏高效IO✅

一、前言:谁懂啊!单线程IO,竟是“快递站的笨店员”

刚吃透Linux基础IO和网络编程的宝子们,是不是被“单线程IO”搞破防了?写个简单的IO程序,单线程只能处理一个任务:要么一直等快递(读操作),要么一直送快递(写操作),哪怕其他快递柜有快递要取、有包裹要送,也只能眼睁睁看着,忙的忙死、闲的闲死。

就像小区快递站只有一个笨店员,每天只盯着一个快递柜,要么一直等别人来取快递,哪怕其他快递柜堆满了包裹,也不带动一下;要么一直往一个快递柜放包裹,哪怕别的快递柜是空的,也不换地方,效率低到被业主投诉。

而Linux IO多路复用,就是把这个“笨店员”训练成“全能调度员”,一个人就能管好所有快递柜,同时盯着多个快递柜的动态:哪个快递柜有快递要取(读事件)、哪个快递柜能放包裹(写事件),调度员一眼就能看到,不用死盯一个,效率直接拉满。

今天就用最接地气、最风趣的话,把Linux IO多路复用讲透,不搞复杂底层原理,不堆晦涩术语,只讲“IO多路复用是什么、为什么需要、3种实现方式怎么用”,搭配快递站调度员类比和注释拉满的实操代码,全程无多余内容,新手跟着学,马年轻松拿捏Linux IO多路复用,再也不用被“单线程低效”折磨!

二、先搞懂:IO多路复用,本质就是“快递站的全能调度”

2.1 核心定义:IO多路复用 = 一个调度员,管好所有快递柜

先破除新手恐惧:IO多路复用不是什么高深技术,本质就是“一个线程(调度员),同时监听多个IO事件(快递柜动态)”,不用创建多个线程或进程,就能同时处理多个读、写操作,核心就是“高效监听、灵活调度”,解决单线程IO的低效问题。

还是用“快递站”的类比,新手不用死记硬背,一眼就能懂单线程IO和IO多路复用的区别,看完再也不混淆:

1.  单线程IO(笨店员):一个人只盯一个快递柜,要么等取件(阻塞读),要么等放件(阻塞写),其他快递柜的动态完全不管,哪怕有快递堆积、业主催单,也只能束手无策,效率极低;

2.  IO多路复用(全能调度员):一个人盯所有快递柜,手里拿个调度本(监听机制),实时记录每个快递柜的状态——哪个有快递要取、哪个能放包裹、哪个没人用,调度员不用死盯一个,哪个有动静就去处理哪个,一个人能干多个人的活,效率翻倍。

补充一句:IO多路复用里的“多路”,就是“多个IO事件”,比如多个文件读、多个网络连接的读/写,就像快递站的“多个快递柜”;“复用”,就是“复用一个线程”,相当于一个调度员管好所有快递柜,不用多雇人,节省资源。

2.2 灵魂拷问:为什么非要学IO多路复用?单线程不够用吗?

新手最头疼的问题:我写个单线程IO程序,能读文件、写文件、发消息,不就够了吗?为什么非要学IO多路复用?其实不是不够用,而是遇到“多IO事件”的场景,单线程就会彻底拉胯,就像快递站只有一个笨店员,业主多了、快递多了,就会堆积、卡顿,体验拉胯:

举个实操场景(新手能懂的简单例子):你写一个服务器,需要同时处理10个客户端的消息(网络IO),还要同时读取本地日志文件(文件IO),用单线程的话,只能先处理完一个客户端的消息,再读日志,再处理下一个客户端,其他客户端只能排队等,卡顿到没法用;而用IO多路复用,一个线程就能同时监听10个客户端的消息和日志文件的读事件,哪个有动静就处理哪个,不耽误事,效率直接拉满。

核心原因总结(新手记这3点就够):

1.  提升效率:一个线程处理多个IO事件,不用死等单个IO完成,避免“忙的忙死、闲的闲死”,大幅提升程序运行效率;

2.  节省资源:不用创建多个线程或进程,一个线程就能搞定,减少系统资源占用(线程/进程创建、销毁很耗资源),就像快递站不用多雇店员,一个调度员就够;

3.  适配高频场景:服务器开发、高并发IO、多设备通信,这些场景都需要同时处理多个IO事件,IO多路复用是必备技能,单线程根本替代不了。

小结:Linux IO多路复用,就是“IO操作的全能升级”,从“笨店员单干”变成“调度员统筹”,学会它,你就能写出高效、省资源的IO程序,应对高并发、多IO场景,不用再被单线程的低效折磨。

三、新手必懂:IO多路复用3种实现方式,马年直接抄作业

很多新手觉得“IO多路复用很难”,其实一点都不难!Linux IO多路复用有3种最常用的实现方式:select、poll、epoll,从简单到高效,新手优先掌握select和epoll,用法固定,代码可以直接复制粘贴,不用纠结底层原理,先会用、先看到效果,再慢慢进阶。

重点说明:3种方式的核心逻辑都是“监听多个IO事件”,只是监听的方式、效率、上限不一样,就像快递站调度员的3种工作方式,有的效率一般、有的高效能打;代码用Linux C语言编写,注释拉满,编译命令单独标注,新手直接抄,就能运行。

3.1 方式1:select——最基础的“手写调度本”

select是最基础、最古老的IO多路复用方式,相当于快递站调度员“手写调度本”,每次上班都要把所有快递柜的编号写在本子上,然后逐个检查每个快递柜的状态,哪个有动静就去处理哪个,简单但效率一般,适合IO事件比较少的场景。

核心逻辑:创建一个“事件集合”(手写调度本),把需要监听的IO事件(快递柜)加入集合,然后调用select函数,让系统帮忙检查这个集合里的IO事件,有事件发生(快递柜有动静),就通知调度员(线程)去处理,处理完再重新检查。

核心特点:简单易上手,兼容性好(所有Linux系统都支持),但有上限——最多只能监听1024个IO事件(相当于调度本只能写1024个快递柜编号),事件多了,检查效率会越来越低。

实操代码示例(监听文件IO和网络IO,新手直接抄):

```Plain Text

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/select.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

int main() {

   int sock_fd, client_fd;

   struct sockaddr_in server_addr, client_addr;

   socklen_t client_addr_len = sizeof(client_addr);

   char buf[1024] = {0};

   fd_set read_fds; // 读事件集合(手写调度本)

   int max_fd; // 最大文件描述符(最大快递柜编号)

   // 1. 创建网络套接字(相当于一个快递柜,用于接收客户端消息)

   sock_fd = socket(AF_INET, SOCK_STREAM, 0);

   server_addr.sin_family = AF_INET;

   server_addr.sin_port = htons(8888);

   server_addr.sin_addr.s_addr = INADDR_ANY;

   bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));

   listen(sock_fd, 5);

   printf("select IO多路复用已启动,监听8888端口和标准输入(键盘)...\n");

   // 初始化最大文件描述符(最大快递柜编号)

   max_fd = sock_fd;

   while (1) {

       // 1. 清空事件集合(清空调度本),每次都要重新初始化

       FD_ZERO(&read_fds);

       // 2. 把需要监听的IO事件加入集合(把快递柜编号写进调度本)

       FD_SET(sock_fd, &read_fds); // 监听网络连接(快递柜1:接收客户端)

       FD_SET(0, &read_fds); // 监听标准输入(快递柜2:键盘输入)

       // 更新最大文件描述符

       if (0 > max_fd) max_fd = 0;

       // 3. 监听事件(调度员检查所有快递柜状态)

       // 第一个参数:最大文件描述符+1,第二个参数:读事件集合,后面两个:写/异常事件(暂不用),最后:超时时间(NULL表示一直等)

       int ret = select(max_fd + 1, &read_fds, NULL, NULL, NULL);

       if (ret == -1) {

           printf("监听失败,相当于调度员没检查到快递柜状态~\n");

           continue;

       }

       // 4. 检查哪个IO事件发生(哪个快递柜有动静)

       // 检查标准输入(键盘输入,快递柜2)

       if (FD_ISSET(0, &read_fds)) {

           memset(buf, 0, sizeof(buf));

           read(0, buf, sizeof(buf)); // 读取键盘输入(取快递)

           printf("键盘输入:%s", buf);

       }

       // 检查网络连接(客户端连接,快递柜1)

       if (FD_ISSET(sock_fd, &read_fds)) {

           client_fd = accept(sock_fd, (struct sockaddr*)&client_addr, &client_addr_len);

           printf("客户端已连接,IP:%s,端口:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

           // 这里可以继续监听客户端消息,简化处理,暂不展开

           close(client_fd);

       }

   }

   close(sock_fd);

   return 0;

}

```

编译命令(新手必记):gcc io_select.c -o io_select(直接编译,不用加额外参数)

运行方法:终端敲 ./io_select,启动后,既能监听客户端连接(网络IO),又能监听键盘输入(文件IO),输入键盘内容会实时显示,客户端连接也会提示,实现一个线程处理两个IO事件,比单线程高效太多。

记忆技巧:select = “手写调度本”,每次都要清空、重新填写,最多记1024个“快递柜”,简单但不够高效,新手入门首选。

3.2 方式2:poll——升级款“可扩容调度本”

poll是select的升级版本,相当于快递站调度员换了一个“可扩容调度本”,不用局限于1024个快递柜编号,想记多少记多少,而且不用每次都重新填写所有快递柜编号,比select更灵活、更高效,但本质还是“逐个检查快递柜”,事件多了效率还是会下降。

核心逻辑:创建一个“事件数组”(可扩容调度本),每个元素对应一个IO事件(快递柜),标注好要监听的事件类型(读/写),调用poll函数,让系统检查这个数组里的IO事件,有事件发生就通知线程处理,不用每次都清空重新填写。

核心特点:没有1024个IO事件的上限(调度本可扩容),不用每次重新初始化事件集合,兼容性也很好,但还是“逐个检查事件”,高并发场景下效率一般。

实操代码示例(简化版,新手直接抄):

```Plain Text

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/poll.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define MAX_EVENTS 10 // 最多监听10个IO事件(可扩容)

int main() {

   int sock_fd, client_fd;

   struct sockaddr_in server_addr, client_addr;

   socklen_t client_addr_len = sizeof(client_addr);

   char buf[1024] = {0};

   // 事件数组(可扩容调度本),每个元素是一个IO事件

   struct pollfd fds[MAX_EVENTS];

   int nfds = 2; // 监听的事件数量

   // 1. 创建网络套接字(快递柜1:接收客户端)

   sock_fd = socket(AF_INET, SOCK_STREAM, 0);

   server_addr.sin_family = AF_INET;

   server_addr.sin_port = htons(8888);

   server_addr.sin_addr.s_addr = INADDR_ANY;

   bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));

   listen(sock_fd, 5);

   // 2. 初始化事件数组(填写调度本)

   fds[0].fd = sock_fd; // 事件1:网络套接字

   fds[0].events = POLLIN; // 监听读事件(有客户端连接/发消息)

   fds[1].fd = 0; // 事件2:标准输入(键盘)

   fds[1].events = POLLIN; // 监听读事件(有键盘输入)

   printf("poll IO多路复用已启动,监听8888端口和标准输入(键盘)...\n");

   while (1) {

       // 3. 监听事件(调度员检查所有快递柜状态)

       // 第一个参数:事件数组,第二个参数:事件数量,第三个参数:超时时间(NULL表示一直等)

       int ret = poll(fds, nfds, -1);

       if (ret == -1) {

           printf("监听失败~\n");

           continue;

       }

       // 4. 检查哪个IO事件发生(哪个快递柜有动静)

       for (int i = 0; i < nfds; i++) {

           if (fds[i].revents & POLLIN) { // 有读事件发生

               if (fds[i].fd == 0) { // 键盘输入(快递柜2)

                   memset(buf, 0, sizeof(buf));

                   read(0, buf, sizeof(buf));

                   printf("键盘输入:%s", buf);

               } else if (fds[i].fd == sock_fd) { // 客户端连接(快递柜1)

                   client_fd = accept(sock_fd, (struct sockaddr*)&client_addr, &client_addr_len);

                   printf("客户端已连接,IP:%s,端口:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

                   close(client_fd);

               }

           }

       }

   }

   close(sock_fd);

   return 0;

}

```

编译命令(新手必记):gcc io_poll.c -o io_poll(直接编译,不用加额外参数)

运行方法:和select一样,启动后既能监听客户端连接,又能监听键盘输入,没有1024个事件的上限,想监听多少个IO事件,就扩容事件数组即可,比select更灵活。

记忆技巧:poll = “可扩容调度本”,解决了select的1024上限问题,不用每次重新填写,比select好用,但还是“逐个检查”,适合中等数量的IO事件。

3.3 方式3:epoll——高效款“智能调度系统”

epoll是Linux最常用、最高效的IO多路复用方式,相当于快递站调度员装上了“智能调度系统”,不用逐个检查每个快递柜,快递柜有动静(IO事件发生),会主动提醒调度员,调度员只需要处理有动静的快递柜,不用做无用功,效率拉满,适合高并发、大量IO事件的场景(比如服务器开发)。

核心逻辑:创建一个“智能事件列表”(智能调度系统),把需要监听的IO事件加入列表,系统会实时监控这些事件,一旦有事件发生(快递柜有动静),就会把该事件加入“就绪列表”,线程只需要从就绪列表中获取事件、处理事件,不用逐个检查,效率极高。

核心特点:没有IO事件上限,效率不随事件数量增加而下降(智能提醒,不用逐个检查),是Linux高并发IO的首选,也是新手必须重点掌握的方式。

实操代码示例(新手友好版,注释拉满):

```Plain Text

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/epoll.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#define MAX_EVENTS 100 // 最多处理100个就绪事件

int main() {

   int sock_fd, client_fd, epoll_fd;

   struct sockaddr_in server_addr, client_addr;

   socklen_t client_addr_len = sizeof(client_addr);

   char buf[1024] = {0};

   struct epoll_event ev, events[MAX_EVENTS];

   int nfds;

   // 1. 创建网络套接字(快递柜1:接收客户端)

   sock_fd = socket(AF_INET, SOCK_STREAM, 0);

   server_addr.sin_family = AF_INET;

   server_addr.sin_port = htons(8888);

   server_addr.sin_addr.s_addr = INADDR_ANY;

   bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));

   listen(sock_fd, 5);

   // 2. 创建epoll实例(智能调度系统)

   epoll_fd = epoll_create1(0);

   if (epoll_fd == -1) {

       printf("epoll创建失败,相当于智能调度系统坏了~\n");

       return 1;

   }

   // 3. 把网络套接字加入epoll监听(把快递柜1加入智能系统)

   ev.events = EPOLLIN; // 监听读事件

   ev.data.fd = sock_fd;

   if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock_fd, &ev) == -1) {

       printf("加入监听失败~\n");

       return 1;

   }

   // 4. 把标准输入(键盘)加入epoll监听(把快递柜2加入智能系统)

   ev.events = EPOLLIN;

   ev.data.fd = 0;

   if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &ev) == -1) {

       printf("加入监听失败~\n");

       return 1;

   }

   printf("epoll IO多路复用已启动,监听8888端口和标准输入(键盘)...\n");

   while (1) {

       // 5. 等待就绪事件(智能系统提醒,有快递柜有动静)

       // 第一个参数:epoll实例,第二个参数:就绪事件数组,第三个参数:最大事件数,第四个参数:超时时间(-1表示一直等)

       nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);

       if (nfds == -1) {

           printf("等待事件失败~\n");

           continue;

       }

       // 6. 处理就绪事件(调度员处理有动静的快递柜)

       for (int i = 0; i < nfds; i++) {

           if (events[i].data.fd == 0) { // 键盘输入(快递柜2)

               memset(buf, 0, sizeof(buf));

               read(0, buf, sizeof(buf));

               printf("键盘输入:%s", buf);

           } else if (events[i].data.fd == sock_fd) { // 客户端连接(快递柜1)

               client_fd = accept(sock_fd, (struct sockaddr*)&client_addr, &client_addr_len);

               printf("客户端已连接,IP:%s,端口:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

               close(client_fd);

           }

       }

   }

   // 关闭资源

   close(sock_fd);

   close(epoll_fd);

   return 0;

}

```

编译命令(新手必记):gcc io_epoll.c -o io_epoll(直接编译,不用加额外参数)

运行方法:启动后,既能监听客户端连接,又能监听键盘输入,效率比select、poll高很多,哪怕监听100个、1000个IO事件,也能轻松应对,是服务器开发的首选方式。

记忆技巧:epoll = “智能调度系统”,快递柜有动静主动提醒,不用逐个检查,高效能打,新手重点掌握,后续高并发开发全靠它。

小结:3种实现方式,新手入门先学select(简单),进阶学epoll(高效),poll了解即可;select是手写调度本,poll是可扩容调度本,epoll是智能调度系统,按需选择,高并发场景优先用epoll。

四、避坑指南:新手写IO多路复用,别再踩这些坑

4.1 陷阱1:select忘记初始化事件集合,导致监听失败

新手最容易犯的错:用select时,忘记在循环中用FD_ZERO清空事件集合,导致事件集合混乱,监听失败,就像调度员的手写调度本没清空,旧的快递柜编号和新的混在一起,没法正确检查状态。

避坑妙招:每次调用select前,都要先用FD_ZERO清空事件集合,再重新加入需要监听的IO事件,一步都不能少。

4.2 陷阱2:epoll忘记创建实例,直接调用epoll_ctl

很多新手写epoll代码时,直接调用epoll_ctl加入监听事件,忘记先用epoll_create1创建epoll实例,导致代码报错,就像调度员没装智能系统,就想让系统提醒,根本不可能。

避坑妙招:写epoll代码,第一步必须创建epoll实例(epoll_create1),再用epoll_ctl加入监听事件,顺序不能乱。

4.3 陷阱3:混淆IO事件类型,监听读事件却写数据

新手容易混淆IO事件类型,比如监听的是读事件(POLLIN、EPOLLIN),却试图往IO设备写数据,导致事件无法触发,就像调度员盯着快递柜的“取件”状态,却想往里面放包裹,根本没用。

避坑妙招:明确自己要监听的事件类型,读数据就监听读事件(POLLIN、EPOLLIN),写数据就监听写事件(POLLOUT、EPOLLOUT),不要混淆。

4.4 陷阱4:处理完IO事件,忘记关闭文件描述符

新手写代码时,处理完客户端连接、文件读写后,忘记关闭对应的文件描述符,导致文件描述符泄露,系统资源被占用,就像快递柜用完不关门,一直占用资源,其他快递没法放。

避坑妙招:只要不再使用某个文件描述符(比如客户端断开连接、文件读写完成),就立即用close()关闭,释放资源。

4.5 陷阱5:觉得epoll一定比select好,所有场景都用epoll

新手容易走进“epoll万能”的误区,觉得epoll效率高,不管IO事件多少,都用epoll,其实不是这样——如果IO事件很少(比如只有2-3个),select比epoll更简单、更省资源,就像快递柜只有2个,手写调度本比智能系统更方便。

避坑妙招:按需选择实现方式,IO事件少用select,中等数量用poll,高并发、多IO事件用epoll,不用盲目追求“高效”。

五、结尾:IO多路复用不难学,马年轻松玩转高效IO

看到这里,是不是觉得Linux IO多路复用一点都不难?其实它就是“快递站的全能调度”,核心就是一个线程监听多个IO事件,3种实现方式各有优劣,代码可以直接抄,只要记住“调度本”的类比,就能轻松理解,不用怕晦涩的术语和函数。

新手不用怕,刚开始不用追求复杂的底层原理,先掌握select和epoll的基础用法,能实现一个线程处理多个IO事件,能成功运行代码、看到效果,就足够了。学会IO多路复用,你就能写出高效、省资源的网络程序和IO程序,应对高并发场景,不用再被单线程的低效折磨。

记住,IO多路复用是Linux高并发开发的核心技能,不管是服务器开发、网络编程,还是IO密集型程序,都离不开它,学会它,能让你对Linux IO的理解更上一层楼,离“Linux高手”又近了一步。

2026丙午马年,愿你吃透Linux IO多路复用,轻松玩转高效IO操作,不踩坑、不懵圈,编写高并发程序一马当先,早日实现“Linux IO编程自由”!

✨ 关注我,下期解锁epoll进阶(边缘触发/水平触发),新手也能轻松拿捏Linux ✨

扫码关注我们

知识奇妙世界

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-16 08:56:50 HTTP/2.0 GET : https://f.mffb.com.cn/a/485816.html
  2. 运行时间 : 0.463116s [ 吞吐率:2.16req/s ] 内存消耗:4,986.05kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9fc7b48dc7670e6bff92294192992515
  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.000753s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001299s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.013785s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.009354s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001815s ]
  6. SELECT * FROM `set` [ RunTime:0.011821s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001477s ]
  8. SELECT * FROM `article` WHERE `id` = 485816 LIMIT 1 [ RunTime:0.002145s ]
  9. UPDATE `article` SET `lasttime` = 1776301010 WHERE `id` = 485816 [ RunTime:0.012207s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000788s ]
  11. SELECT * FROM `article` WHERE `id` < 485816 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003161s ]
  12. SELECT * FROM `article` WHERE `id` > 485816 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.017336s ]
  13. SELECT * FROM `article` WHERE `id` < 485816 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.051672s ]
  14. SELECT * FROM `article` WHERE `id` < 485816 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.134246s ]
  15. SELECT * FROM `article` WHERE `id` < 485816 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.055406s ]
0.466950s