当前位置:首页>Linux>救命!Linux并发服务器,竟是“一人多岗的全能店员”

救命!Linux并发服务器,竟是“一人多岗的全能店员”

  • 2026-04-16 16:00:36
救命!Linux并发服务器,竟是“一人多岗的全能店员”

点击蓝字

关注我们

救命!Linux并发服务器,竟是“一人多岗的全能店员”

新手必看|告别“排队等服务”,通俗讲透多客户端连接,马年轻松拿捏并发编程✅

一、前言:谁懂啊!普通TCP服务器,竟是“社恐单线程店员”

刚吃透基础TCP编程的宝子们,又被“并发服务器”搞破防了:上一期写的普通TCP服务器,只能一次接待一个客户端,就像一个社恐店员,一次只敢服务一个顾客,其他顾客只能排着队等,等前一个顾客聊完、断开连接,才能接待下一个;想让两个客户端同时连接服务器,结果一个能连上,另一个直接报错,全程卡壳。

就像你去奶茶店买奶茶,店里只有一个店员,一次只能做一杯奶茶,你点完单后,后面的人只能排队等,哪怕店员很闲,也不能同时接待两个人,效率低到离谱;普通TCP服务器,就是这个“社恐单线程店员”,单线程干活,一次只能处理一个客户端连接,多一个都扛不住。

而Linux并发服务器,就是把这个“社恐店员”训练成“全能店员”,一人多岗、同时接待多个顾客,不用排队、不耽误事,不管是10个还是20个客户端,都能同时连接、同时服务,效率直接拉满。

今天就用最接地气、最风趣的话,把Linux并发服务器讲透,不搞复杂底层原理,不堆晦涩术语,只讲“并发是什么、为什么需要、怎么实现”,搭配奶茶店类比和注释拉满的实操代码,全程无多余内容,新手跟着学,马年轻松拿捏Linux并发服务器,再也不用怕“多客户端排队”!

二、先搞懂:并发服务器,本质就是“全能店员的多任务操作”

2.1 核心定义:并发 = 同时接待多个“顾客”

先破除新手恐惧:并发服务器不是什么高深技术,本质就是让服务器能“同时处理多个客户端连接”,就像奶茶店的全能店员,一边给顾客点单,一边做奶茶,一边递奶茶,同时兼顾多个顾客,不用让顾客排队,核心就是“多任务并行,不耽误事”。

还是用“奶茶店”的类比,新手不用死记硬背,一眼就能懂普通服务器和并发服务器的区别:

1.  普通TCP服务器(单线程):就像社恐店员,一次只接待一个顾客,顾客A点单、等奶茶,期间顾客B、C只能排队,等顾客A拿到奶茶走了,才能接待顾客B,效率极低;

2.  并发服务器:就像全能店员,同时接待多个顾客,顾客A点单时,顾客B可以扫码付款,顾客C可以取之前点的奶茶,互不耽误,哪怕有10个顾客,也能有序服务,效率翻倍。

补充一句:并发不是“同时做同一件事”,而是“快速切换,看起来像同时做”,就像全能店员,不是同时做三杯奶茶,而是快速在点单、做奶茶、递奶茶之间切换,让每个顾客都觉得自己在被单独服务;Linux并发服务器也是一样,快速在多个客户端之间切换,让每个客户端都觉得服务器在专门为自己服务。

2.2 灵魂拷问:为什么一定要学并发服务器?

新手最头疼的问题:我写个普通TCP服务器,能实现客户端和服务器聊天,不就够了吗?为什么非要学并发?其实不是不够,而是遇到“多客户端连接”的场景,就会彻底拉胯,就像奶茶店只有一个社恐店员,顾客多了就会排队、投诉,服务器也是一样:

举个实操场景(新手能懂的简单例子):你写一个聊天工具,想让10个朋友同时连接你的服务器,一起聊天;你写一个简单的网页服务器,想让多个用户同时访问你的页面;你写一个远程控制工具,想让多台电脑同时连接服务器——这些场景,普通单线程服务器根本扛不住,只能让大家排队,体验拉胯,而并发服务器,就能轻松搞定。

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

1.  提升服务效率:同时处理多个客户端连接,不用让客户端排队,减少等待时间,提升用户体验;

2.  满足多用户需求:实际开发中,服务器都是要同时服务多个用户的(比如微信服务器,同时服务亿级用户),并发是必备技能;

3.  夯实编程基础:学并发服务器,能让你更懂TCP编程、线程/进程,为后续学高并发、分布式服务器打基础。

小结:Linux并发服务器,就是“服务器的全能升级”,从“社恐单线程”变成“全能多任务”,学会它,你就能写出能同时服务多个客户端的服务器,不用再局限于“单客户端通信”,真正具备实际开发能力。

三、新手必懂:并发服务器的3种实现方式,马年直接抄作业

很多新手觉得“并发服务器很难”,其实一点都不难,Linux并发服务器有3种最常用的实现方式,从简单到复杂,新手优先掌握前两种,用法固定,代码可以直接复制粘贴,不用纠结底层原理,先会用、先看到效果,再慢慢进阶。

重点说明:所有实现方式,都基于上一期的TCP编程基础,核心还是“服务器端+客户端”,只是在服务器端增加了“并发处理逻辑”;代码用Linux C语言编写,注释拉满,编译命令单独标注,新手直接抄,就能运行。

3.1 方式1:多进程并发(fork)—— 最简单,相当于“多雇几个店员”

多进程并发,是最简单、最容易上手的并发方式,相当于给奶茶店多雇几个店员,每个店员负责接待一个顾客,顾客A由店员1服务,顾客B由店员2服务,互不干扰,哪怕一个店员忙不过来,其他店员也能正常接待。

核心逻辑:服务器端启动后,先做好监听(守电话),当有客户端连接时,服务器创建一个新的进程(新店员),让新进程专门处理这个客户端的收发消息,自己则继续监听,等待下一个客户端连接,实现“同时服务多个客户端”。

实操代码示例(服务器端,client.c沿用上一期的,直接复用):

```Plain Text

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/wait.h>

#include <signal.h>

// 信号处理函数:回收子进程资源,避免僵尸进程

void sig_handler(int sig) {

   // 循环回收所有结束的子进程

   while (waitpid(-1, NULL, WNOHANG) > 0);

}

int main() {

   int server_fd, client_fd;

   struct sockaddr_in server_addr, client_addr;

   socklen_t client_addr_len = sizeof(client_addr);

   char buf[1024] = {0};

   pid_t pid;

   // 注册信号,回收子进程资源

   signal(SIGCHLD, sig_handler);

   // 1. 创建套接字(打开手机)

   server_fd = socket(AF_INET, SOCK_STREAM, 0);

   if (server_fd == -1) {

       printf("套接字创建失败,相当于手机打不开~\n");

       return 1;

   }

   // 2. 绑定IP和端口(设置电话号码和房间号)

   server_addr.sin_family = AF_INET;

   server_addr.sin_port = htons(8888);

   server_addr.sin_addr.s_addr = INADDR_ANY;

   if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

       printf("绑定IP和端口失败,相当于电话号码设置错了~\n");

       close(server_fd);

       return 1;

   }

   // 3. 监听连接(打开铃声,守电话)

   if (listen(server_fd, 5) == -1) {

       printf("监听失败,相当于手机铃声没打开~\n");

       close(server_fd);

       return 1;

   }

   printf("多进程并发服务器已启动,监听8888端口,可同时接待多个客户端...\n");

   // 循环接受客户端连接(一直守电话,接待多个顾客)

   while (1) {

       // 4. 接受连接(接听电话)

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

       if (client_fd == -1) {

           printf("接受连接失败,相当于没接到电话~\n");

           continue; // 接受失败,继续等待下一个连接

       }

       printf("客户端已连接,IP:%s,端口:%d\n",

              inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

       // 5. 创建子进程(多雇一个店员,专门服务这个客户端)

       pid = fork();

       if (pid == -1) {

           printf("创建子进程失败,没法接待这个客户端~\n");

           close(client_fd);

           continue;

       } else if (pid == 0) {

           // 子进程:专门处理当前客户端的收发消息(店员服务顾客)

           close(server_fd); // 子进程不用监听,关闭服务器套接字

           while (1) {

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

               // 读取客户端消息

               int read_len = read(client_fd, buf, sizeof(buf));

               if (read_len == -1) {

                   printf("读取消息失败~\n");

                   break;

               } else if (read_len == 0) {

                   printf("客户端已断开连接,服务结束~\n");

                   break;

               }

               printf("客户端(IP:%s):%s\n", inet_ntoa(client_addr.sin_addr), buf);

               // 回复客户端消息

               char msg[] = "收到啦!我是并发服务器(子进程)~";

               write(client_fd, msg, strlen(msg));

           }

           close(client_fd); // 子进程服务结束,关闭客户端套接字

           exit(0); // 子进程退出,避免占用资源

       } else {

           // 父进程:继续监听,等待下一个客户端(老板继续守店)

           close(client_fd); // 父进程不用处理具体消息,关闭客户端套接字

       }

   }

   // 关闭服务器套接字(理论上不会执行到这里)

   close(server_fd);

   return 0;

}

```

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

运行方法:先启动服务器(./server_fork),再打开多个终端,每个终端启动一个客户端(./client,沿用上一期的client.c),就能实现多个客户端同时连接服务器、同时发消息,服务器会分别回复,不用排队。

记忆技巧:fork = “创建子进程”,联想成“多雇店员”,父进程负责“守店、接客”,子进程负责“服务单个顾客”,简单好记,新手优先掌握。

3.2 方式2:多线程并发(pthread)—— 更轻量,相当于“店员分身”

多线程并发,是比多进程更轻量的并发方式,相当于奶茶店的店员学会了“分身术”,一个店员分出多个分身,每个分身负责接待一个顾客,不用多雇人,节省成本,效率也更高——线程比进程更轻量,创建和销毁的速度更快,占用的系统资源更少。

核心逻辑:服务器端启动后,做好监听,当有客户端连接时,创建一个新的线程(店员分身),让新线程专门处理这个客户端的收发消息,父线程继续监听,等待下一个客户端连接,实现“轻量级并发”。

实操代码示例(服务器端,client.c仍沿用上一期的):

```Plain Text

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <pthread.h>

// 线程处理函数的参数:需要传递客户端套接字和客户端地址

struct client_info {

   int client_fd;

   struct sockaddr_in client_addr;

};

// 线程处理函数:专门处理单个客户端的收发消息(店员分身服务顾客)

void *client_handler(void *arg) {

   struct client_info *info = (struct client_info *)arg;

   int client_fd = info->client_fd;

   struct sockaddr_in client_addr = info->client_addr;

   char buf[1024] = {0};

   // 分离线程,避免线程结束后占用资源(不用手动回收)

   pthread_detach(pthread_self());

   printf("客户端已连接,IP:%s,端口:%d\n",

          inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

   while (1) {

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

       // 读取客户端消息

       int read_len = read(client_fd, buf, sizeof(buf));

       if (read_len == -1) {

           printf("读取消息失败~\n");

           break;

       } else if (read_len == 0) {

           printf("客户端(IP:%s)已断开连接,服务结束~\n", inet_ntoa(client_addr.sin_addr));

           break;

       }

       printf("客户端(IP:%s):%s\n", inet_ntoa(client_addr.sin_addr), buf);

       // 回复客户端消息

       char msg[] = "收到啦!我是并发服务器(线程)~";

       write(client_fd, msg, strlen(msg));

   }

   // 关闭客户端套接字,释放资源

   close(client_fd);

   // 释放参数内存

   free(info);

   return NULL;

}

int main() {

   int server_fd, client_fd;

   struct sockaddr_in server_addr, client_addr;

   socklen_t client_addr_len = sizeof(client_addr);

   pthread_t tid;

   // 1. 创建套接字(打开手机)

   server_fd = socket(AF_INET, SOCK_STREAM, 0);

   if (server_fd == -1) {

       printf("套接字创建失败,相当于手机打不开~\n");

       return 1;

   }

   // 2. 绑定IP和端口(设置电话号码和房间号)

   server_addr.sin_family = AF_INET;

   server_addr.sin_port = htons(8888);

   server_addr.sin_addr.s_addr = INADDR_ANY;

   if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

       printf("绑定IP和端口失败,相当于电话号码设置错了~\n");

       close(server_fd);

       return 1;

   }

   // 3. 监听连接(打开铃声,守电话)

   if (listen(server_fd, 5) == -1) {

       printf("监听失败,相当于手机铃声没打开~\n");

       close(server_fd);

       return 1;

   }

   printf("多线程并发服务器已启动,监听8888端口,可同时接待多个客户端...\n");

   // 循环接受客户端连接(一直守电话,接待多个顾客)

   while (1) {

       // 4. 接受连接(接听电话)

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

       if (client_fd == -1) {

           printf("接受连接失败,相当于没接到电话~\n");

           continue;

       }

       // 分配内存,存储客户端信息(传递给线程)

       struct client_info *info = (struct client_info *)malloc(sizeof(struct client_info));

       info->client_fd = client_fd;

       info->client_addr = client_addr;

       // 5. 创建线程(店员分身,专门服务这个客户端)

       if (pthread_create(&tid, NULL, client_handler, info) != 0) {

           printf("创建线程失败,没法接待这个客户端~\n");

           close(client_fd);

           free(info);

           continue;

       }

   }

   // 关闭服务器套接字(理论上不会执行到这里)

   close(server_fd);

   return 0;

}

```

编译命令(新手必记):gcc server_pthread.c -o server_pthread -lpthread(线程编程必须加-lpthread参数,否则编译报错)

运行方法:和多进程并发一样,先启动服务器(./server_pthread),再打开多个终端启动客户端,就能实现多客户端同时连接、同时通信,比多进程更轻量、启动更快。

记忆技巧:pthread = “线程”,联想成“店员分身”,一个主线程(老板)守店,多个子线程(分身)服务顾客,不用多雇人,节省资源,新手重点掌握这种方式。

3.3 方式3:IO多路复用(select)—— 更高效,相当于“店员带呼叫器”

IO多路复用,是更高效的并发方式,相当于奶茶店的店员带了一个呼叫器,所有顾客点单后,店员不用一直盯着每个顾客,而是做自己的事,哪个顾客需要服务(比如奶茶做好了),呼叫器就会提醒店员,店员再去服务,效率最高,能同时服务大量客户端。

核心逻辑:服务器端用select函数,同时监听多个客户端的“消息事件”(比如客户端发消息、客户端断开连接),不用创建多个进程或线程,一个线程就能处理所有客户端连接,当某个客户端有消息时,select会提醒服务器,服务器再去处理这个客户端的消息,适合客户端数量多、消息不频繁的场景。

实操代码示例(服务器端,client.c沿用):

```Plain Text

#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/select.h>

#define MAX_CLIENT 10 // 最大支持10个客户端连接

int main() {

   int server_fd, client_fd;

   struct sockaddr_in server_addr, client_addr;

   socklen_t client_addr_len = sizeof(client_addr);

   char buf[1024] = {0};

   int client_fds[MAX_CLIENT] = {0}; // 存储所有客户端套接字

   int max_fd; // 最大文件描述符(用于select)

   fd_set read_fds; // 读事件集合(监听客户端发消息)

   // 1. 创建套接字(打开手机)

   server_fd = socket(AF_INET, SOCK_STREAM, 0);

   if (server_fd == -1) {

       printf("套接字创建失败,相当于手机打不开~\n");

       return 1;

   }

   // 2. 绑定IP和端口(设置电话号码和房间号)

   server_addr.sin_family = AF_INET;

   server_addr.sin_port = htons(8888);

   server_addr.sin_addr.s_addr = INADDR_ANY;

   if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {

       printf("绑定IP和端口失败,相当于电话号码设置错了~\n");

       close(server_fd);

       return 1;

   }

   // 3. 监听连接(打开铃声,守电话)

   if (listen(server_fd, 5) == -1) {

       printf("监听失败,相当于手机铃声没打开~\n");

       close(server_fd);

       return 1;

   }

   printf("IO多路复用并发服务器已启动,监听8888端口,支持最多10个客户端...\n");

   // 初始化客户端套接字数组,把服务器套接字加入数组

   client_fds[0] = server_fd;

   max_fd = server_fd;

   while (1) {

       // 初始化读事件集合

       FD_ZERO(&read_fds);

       // 把所有客户端套接字和服务器套接字加入读事件集合

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

           if (client_fds[i] != 0) {

               FD_SET(client_fds[i], &read_fds);

               // 更新最大文件描述符

               if (client_fds[i] > max_fd) {

                   max_fd = client_fds[i];

               }

           }

       }

       // 监听读事件(呼叫器等待提醒)

       // 第二个参数:最大文件描述符+1,第三个参数:读事件,后面两个参数:超时时间(NULL表示一直等待)

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

       if (ret == -1) {

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

           continue;

       }

       // 检查服务器套接字是否有新连接(有新顾客上门)

       if (FD_ISSET(server_fd, &read_fds)) {

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

           if (client_fd == -1) {

               printf("接受连接失败~\n");

               continue;

           }

           printf("客户端已连接,IP:%s,端口:%d\n",

                  inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

           // 把新客户端套接字加入数组

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

               if (client_fds[i] == 0) {

                   client_fds[i] = client_fd;

                   break;

               }

           }

       }

       // 检查哪个客户端有消息(哪个顾客呼叫)

       for (int i = 1; i < MAX_CLIENT; i++) {

           if (client_fds[i] != 0 && FD_ISSET(client_fds[i], &read_fds)) {

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

               // 读取客户端消息

               int read_len = read(client_fds[i], buf, sizeof(buf));

               if (read_len == -1) {

                   printf("读取消息失败~\n");

                   close(client_fds[i]);

                   client_fds[i] = 0;

                   continue;

               } else if (read_len == 0) {

                   printf("客户端(IP:%s)已断开连接~\n", inet_ntoa(client_addr.sin_addr));

                   close(client_fds[i]);

                   client_fds[i] = 0;

                   continue;

               }

               printf("客户端(IP:%s):%s\n", inet_ntoa(client_addr.sin_addr), buf);

               // 回复客户端消息

               char msg[] = "收到啦!我是IO多路复用服务器~";

               write(client_fds[i], msg, strlen(msg));

           }

       }

   }

   // 关闭服务器套接字(理论上不会执行到这里)

   close(server_fd);

   return 0;

}

```

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

记忆技巧:select = “选择、监听”,联想成“店员带呼叫器”,一个店员监听所有顾客的呼叫,哪个顾客有需求就去服务,高效且节省资源,适合客户端数量多的场景,新手了解即可,先掌握前两种方式。

小结:3种并发方式,新手优先掌握多进程和多线程(简单、易上手),IO多路复用可以后续进阶;多进程相当于“多雇店员”,多线程相当于“店员分身”,IO多路复用相当于“店员带呼叫器”,按需选择即可。

四、避坑指南:新手写并发服务器,别再踩这些坑

4.1 陷阱1:多进程并发,忘记回收子进程,导致僵尸进程

新手最容易犯的错:多进程并发时,子进程服务完客户端后,没有回收资源,导致子进程变成“僵尸进程”,一直占用系统资源,时间长了,系统会越来越卡,就像店员服务完顾客后,不下班、一直占着工位,影响其他店员工作。

避坑妙招:用signal函数注册SIGCHLD信号,在信号处理函数中,用waitpid循环回收子进程资源,就像老板监督店员,服务完顾客必须下班,释放工位。

4.2 陷阱2:多线程并发,忘记分离线程或回收线程,导致资源泄露

很多新手写多线程并发时,线程结束后,没有分离线程(pthread_detach),也没有回收线程(pthread_join),导致线程资源一直被占用,就像店员分身服务完顾客后,不消失,一直占着资源。

避坑妙招:新手推荐用pthread_detach(pthread_self()),分离线程,让线程结束后自动释放资源,不用手动回收,简单又省心。

4.3 陷阱3:IO多路复用,忘记初始化读事件集合,导致监听失败

新手用select实现并发时,经常忘记在循环中用FD_ZERO初始化读事件集合,导致读事件集合混乱,监听失败,就像店员的呼叫器没重置,没法正确接收顾客的呼叫。

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

4.4 陷阱4:客户端断开连接,忘记关闭套接字,导致资源浪费

新手写代码时,不管是多进程、多线程,还是IO多路复用,客户端断开连接后,都忘记关闭客户端套接字,导致套接字资源一直被占用,就像顾客走了,店员不清理工位,一直占着资源。

避坑妙招:只要检测到客户端断开连接(read返回0),就立即用close()关闭客户端套接字,释放资源,避免浪费。

4.5 陷阱5:端口被占用,导致服务器启动失败

新手启动并发服务器时,经常报错“绑定失败”,和普通TCP服务器一样,是端口被其他程序占用了,就像奶茶店的电话号码被别人占用了,顾客打不通电话。

避坑妙招:用netstat -tuln或ss -tuln命令,查看8888端口是否被占用;如果被占用,要么关闭占用端口的程序,要么把端口号改成其他未被占用的(比如8080),服务器和客户端的端口号要保持一致。

五、结尾:并发服务器不难学,马年轻松玩转高并发入门

看到这里,是不是觉得Linux并发服务器一点都不难?其实它就是“服务器的全能升级”,从“社恐单线程”变成“全能多任务”,核心就是3种实现方式,代码可以直接抄,只要记住奶茶店的类比,就能轻松理解,不用怕晦涩的进程、线程和函数。

新手不用怕,刚开始不用追求复杂的高并发逻辑,先掌握多进程和多线程并发,能实现多个客户端同时连接、同时通信,能成功运行代码、看到效果,就足够了。学会并发服务器,你就能写出能同时服务多个用户的网络程序,不管是做项目还是学运维、服务器开发,都能更具竞争力。

记住,并发服务器是Linux网络编程的进阶内容,也是后续学习高并发服务器、分布式系统的基础,学会它,能让你对Linux进程、线程、网络的理解更上一层楼,离“Linux高手”又近了一步。

2026丙午马年,愿你吃透Linux并发服务器,轻松实现多客户端同时服务,不踩坑、不懵圈,编写高并发程序一马当先,早日实现“Linux高并发编程自由”!

✨ 关注我,下期解锁更多知识,新手也能轻松

扫码关注我们

知识奇妙世界

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-17 15:34:39 HTTP/2.0 GET : https://f.mffb.com.cn/a/485220.html
  2. 运行时间 : 0.100515s [ 吞吐率:9.95req/s ] 内存消耗:4,808.27kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=61e321c8c91494694c78a309d92183e8
  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.000570s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000820s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000317s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000251s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000464s ]
  6. SELECT * FROM `set` [ RunTime:0.000194s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000492s ]
  8. SELECT * FROM `article` WHERE `id` = 485220 LIMIT 1 [ RunTime:0.002393s ]
  9. UPDATE `article` SET `lasttime` = 1776411279 WHERE `id` = 485220 [ RunTime:0.011256s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000245s ]
  11. SELECT * FROM `article` WHERE `id` < 485220 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000441s ]
  12. SELECT * FROM `article` WHERE `id` > 485220 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001693s ]
  13. SELECT * FROM `article` WHERE `id` < 485220 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000985s ]
  14. SELECT * FROM `article` WHERE `id` < 485220 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.012490s ]
  15. SELECT * FROM `article` WHERE `id` < 485220 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001464s ]
0.102203s