当前位置:首页>Linux>如何理解Linux线程池开发思想?

如何理解Linux线程池开发思想?

  • 2026-04-15 06:51:58
如何理解Linux线程池开发思想?

说人话......

嵌入式 Linux 线程池

“我们先养一批固定数量的工人,打螺丝任务来了,就分配给空闲的工人去干,而不是每来一个订单,就临时招一个工人去干。浪费时间,浪费资源”

这就是线程池最核心的开发思想。


一、最直观的理解

在嵌入式Linux开发里,我们经常会遇到这些事情:

  • UART 收到一帧数据,要解析
  • CAN 总线上来了一条报文,要处理
  • RS485 有主从轮询,要收发应答
  • I2C 读温湿度传感器,要做校验和换算
  • SPI 读 ADC / IMU / Flash,要做后处理
  • 网络线程收到命令,要转发给底层设备线程执行

如果每次收到数据都 pthread_create() 创建一个新线程处理,会出现几个问题:

  1. 线程创建和销毁开销大在 Linux 上线程不是“零成本”的,频繁创建会消耗时间和内存。

  2. 系统资源容易失控外设通信高峰时,可能短时间涌入很多任务,线程数暴涨。

  3. 实时性变差CPU 上下文切换太多,反而让真正重要的任务被拖慢。

  4. 调试困难到处都是临时线程,问题很难定位。

所以线程池的思路是:

  • 系统启动时,先创建少量长期存活的工作线程
  • 所有待处理的工作,先放入任务队列
  • 工作线程从队列里不断取任务执行
  • 执行完后不退出,继续等待下一个任务

这就像工厂流水线,比“临时招人干一单就解雇”高效很多。


二、线程池开发思想的本质

线程池不是“为了炫技”,而是为了解决三个核心问题:

1. 复用线程资源

线程是昂贵资源,池化后重复利用。

思想关键词:

  • 减少创建/销毁成本
  • 控制线程数量
  • 提高稳定性

2. 任务与执行解耦

把“谁产生任务”和“谁执行任务”分开。

例如:

  • UART 接收线程只负责收数据
  • 它把“解析这帧数据”封装成任务,扔进线程池
  • 工作线程去解析、校验、入库、上报

这样做的好处是:

  • 接收线程保持轻量,不容易堵塞
  • 业务处理逻辑统一调度
  • 系统结构更清晰

3. 削峰填谷

某一时刻外设数据很多,线程池可以把任务先排队,不让系统瞬间失控。

比如:

  • CAN 一秒来上千帧
  • 你不可能每帧都新建线程
  • 更合理的是:进入队列,多个工作线程并行处理

这就是典型的“高并发输入,有限并行处理”。


三、嵌入式 Linux 中什么时候适合用线程池

线程池不是万能的。先说适合场景。

适合线程池的场景

场景 A:大量短任务

比如:

  • 协议解析
  • CRC 校验
  • 数据格式转换
  • 命令分发
  • 日志打包
  • 数据库存储
  • 传感器数据滤波

这些任务一般:

  • 执行时间较短
  • 数量较多
  • 彼此相对独立

非常适合线程池。


场景 B:I/O 线程 + 计算线程分离

比如:

  • 一个线程负责 UART 接收
  • 接收到完整报文后,投递到线程池处理

这样 I/O 线程只做快进快出,不做重活。


场景 C:多设备统一任务调度

比如系统同时管理:

  • CAN 电机控制器
  • UART 调试口
  • RS485 仪表
  • I2C 温湿度传感器
  • SPI ADC

各外设线程产生的后处理任务,都可以交给同一个线程池。


不太适合线程池的场景

场景 A:强实时单任务链路

例如某些硬实时控制闭环:

  • 中断
  • 唤醒高优先级线程
  • 立即输出 PWM 或控制量

这类链路更强调确定性,不一定适合走线程池。

场景 B:长期阻塞型任务

比如某个线程专门长期阻塞等待串口数据。 这类线程本身就是“设备服务线程”,不适合塞进线程池。

所以记住一句话:

线程池适合“处理任务”,不适合“长期驻守设备”。


四、嵌入式 Linux 常见架构:设备线程 + 线程池

掌握工程化思路。

推荐架构

1. 每种通信外设有自己的 I/O 线程

比如:

  • can_rx_thread
  • uart_rx_thread
  • rs485_poll_thread
  • i2c_scan_thread
  • spi_sample_thread

这些线程主要负责:

  • 打开设备
  • 配置波特率/模式
  • read/write/ioctl/select/poll/epoll
  • 收发数据
  • 拼帧、拆帧
  • 基础超时管理

2. 业务处理放入线程池

例如:

  • 解析报文
  • 数据校验
  • 状态机推进
  • 传感器融合
  • 上传消息
  • 保存日志
  • 命令回包生成

3. 线程池只做“任务消费”

线程池不直接永远盯住设备,它只处理已生成的任务。


五、拿一个真实系统形象化理解

假设我在做一个工业网关,Linux 主板连接:

  • CAN:接电机控制器
  • UART:接 GPS 模块
  • RS485:接电表/温控仪(Modbus RTU)
  • I2C:接温湿度传感器
  • SPI:接 ADC 采样芯片

系统目标:

  • 实时采集各类数据
  • 解析协议
  • 转换成统一数据格式
  • 上报到云端或本地 HMI

系统分工图

                 +----------------------+                 |   Main Control       |                 | init / monitor       |                 +----------+-----------+                            |      -----------------------------------------------------      |            |             |           |            |      v            v             v           v            v+-----------+ +-----------+ +-----------+ +-----------+ +-----------+| CAN RX    | | UART RX   | | RS485     | | I2C Poll  | | SPI Poll  || Thread    | | Thread    | | Thread    | | Thread    | | Thread    |+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+      |             |             |             |             |      | receive     | receive     | request/resp| sample      | sample      v             v             v             v             v                 +-----------------------------------------------+                 |              Task Queue                        |                 +-------------------+---------------------------+                                     |                         +-----------+-----------+                         |   Thread Pool         |                         | worker1 worker2 ...   |                         +-----------+-----------+                                     |                 +-----------------------------------------------+                 | protocol parse / CRC / filter / storage       |                 | alarm check / upload / callback / routing     |                 +-----------------------------------------------+

六、每个外设线程应该做什么


1. CAN 线程

CAN 特点:

  • 数据帧多
  • 单帧短
  • 高吞吐
  • 经常需要快速解析 ID 和数据域

CAN 线程职责

  • socket(PF_CAN, SOCK_RAW, CAN_RAW)
  • bind(can0)
  • 阻塞接收 read()
  • 收到一帧后,快速封装为任务投递到线程池

不建议 CAN 线程做的事

  • 复杂业务判断
  • 长时间日志写盘
  • 数据库存储
  • 云端上传

因为这样会拖慢收帧。

更合理流程

CAN RX thread:  read frame -> copy frame -> push taskWorker thread:  parse ID -> decode signal -> update device state -> notify upper layer

2. UART 线程

UART 常见问题:

  • 粘包
  • 半包
  • 帧头帧尾识别
  • 超时拼帧

UART 线程职责

  • 串口初始化 termios
  • 持续 read
  • 放入环形缓冲区
  • 按协议拼出完整帧
  • 完整帧投递线程池

线程池处理内容

  • 协议解析
  • 校验和验证
  • 命令路由
  • 参数更新

所以:

UART 线程负责“把字节流变成完整报文”,线程池负责“理解这份报文是什么意思”。


3. RS485 线程

RS485 在工业现场非常典型,尤其 Modbus RTU。

它和 UART 不同的点在于:

  • 通常半双工
  • 常有轮询
  • 发送和接收要控制方向
  • 存在主从问答节奏

RS485 线程职责

  • 控制 DE/RE 收发方向
  • 周期性轮询从机
  • 等待应答
  • 处理超时重发
  • 把完整应答报文投递给线程池

线程池职责

  • Modbus 寄存器解析
  • 数据类型转换
  • 越限告警
  • 历史数据记录

看到:

RS485 线程更像“通信调度员”,线程池像“数据处理员”。


4. I2C 线程

I2C 往往连接低速传感器,如:

  • 温湿度
  • 气压
  • 光照
  • EEPROM

I2C 线程职责

  • 周期性读寄存器
  • 完成一次硬件交互
  • 拿到原始字节
  • 投递到线程池

线程池职责

  • 原始值转物理量
  • 滤波
  • 标定补偿
  • 告警判断
  • 上报

例如:

I2C thread:  every 500ms read sensor raw bytesWorker:  raw -> temperature/humidity -> filter -> publish

5. SPI 线程

SPI 常连接:

  • ADC
  • IMU
  • 高速传感器
  • Flash

SPI 可能数据频率更高。

SPI 线程职责

  • 周期采样或中断唤醒采样
  • ioctl(SPI_IOC_MESSAGE)
  • 得到原始采样值
  • 快速压入任务队列

线程池职责

  • 均值滤波
  • FFT 前处理
  • 传感器融合
  • 异常检测

七、线程池在这里到底扮演什么角色

我们可以把整个系统看成餐厅:

  • CAN/UART/RS485/I2C/SPI 线程 = 服务员 负责接单、传菜、拿到原始信息

  • 任务队列 = 后厨待做订单栏

  • 线程池工作线程 = 厨师 负责真正做菜:解析、计算、存储、上报

如果让服务员自己炒菜,就会乱。 如果每来一单都临时招一个厨师,也会乱。

所以线程池本质是:

统一、受控、高效地消费异步任务。


八、线程池的典型数据结构

一个最简线程池一般包含:

1. 任务结构体

typedefstructtask {void (*func)(void *arg);void *arg;structtask *next;task_t;

含义:

  • func:任务执行函数
  • arg:任务参数
  • next:链表指针

2. 线程池结构体

typedefstructthread_pool {pthread_t *threads;int thread_num;task_t *head;task_t *tail;int task_num;pthread_mutex_t mutex;pthread_cond_t cond;int stop;thread_pool_t;

含义:

  • threads:工作线程数组
  • head/tail:任务队列
  • mutex:保护共享队列
  • cond:任务到来时唤醒线程
  • stop:线程池退出标志

九、线程池工作机制

初始化

  • 创建 N 个工作线程
  • 工作线程启动后进入等待状态

投递任务

  • 加锁
  • 任务入队
  • 解锁
  • pthread_cond_signal() 唤醒一个工作线程

工作线程循环

  • 加锁
  • 队列空则等待条件变量
  • 队列非空则取任务
  • 解锁
  • 执行任务函数

销毁

  • 设置停止标志
  • 广播唤醒所有线程
  • join 回收线程
  • 释放队列资源

十、一个简化版线程池代码

#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<unistd.h>typedefstructtask {void (*func)(void *arg);void *arg;structtask *next;task_t;typedefstruct {pthread_t *threads;int thread_num;task_t *head;task_t *tail;pthread_mutex_t mutex;pthread_cond_t cond;int stop;thread_pool_t;void *worker_routine(void *arg){thread_pool_t *pool = (thread_pool_t *)arg;while (1) {        pthread_mutex_lock(&pool->mutex);while (pool->head == NULL && !pool->stop) {            pthread_cond_wait(&pool->cond, &pool->mutex);        }if (pool->stop && pool->head == NULL) {            pthread_mutex_unlock(&pool->mutex);break;        }task_t *task = pool->head;if (task) {            pool->head = task->next;if (pool->head == NULL) {                pool->tail = NULL;            }        }        pthread_mutex_unlock(&pool->mutex);if (task) {            task->func(task->arg);free(task);        }    }returnNULL;}intthread_pool_init(thread_pool_t *pool, int thread_num){    pool->thread_num = thread_num;    pool->head = NULL;    pool->tail = NULL;    pool->stop = 0;    pthread_mutex_init(&pool->mutex, NULL);    pthread_cond_init(&pool->cond, NULL);    pool->threads = malloc(sizeof(pthread_t) * thread_num);if (!pool->threads) return-1;for (int i = 0; i < thread_num; i++) {if (pthread_create(&pool->threads[i], NULL, worker_routine, pool) != 0) {return-1;        }    }return0;}intthread_pool_add_task(thread_pool_t *pool, void (*func)(void *), void *arg){task_t *task = malloc(sizeof(task_t));if (!task) return-1;    task->func = func;    task->arg = arg;    task->next = NULL;    pthread_mutex_lock(&pool->mutex);if (pool->tail == NULL) {        pool->head = pool->tail = task;    } else {        pool->tail->next = task;        pool->tail = task;    }    pthread_cond_signal(&pool->cond);    pthread_mutex_unlock(&pool->mutex);return0;}voidthread_pool_destroy(thread_pool_t *pool){    pthread_mutex_lock(&pool->mutex);    pool->stop = 1;    pthread_cond_broadcast(&pool->cond);    pthread_mutex_unlock(&pool->mutex);for (int i = 0; i < pool->thread_num; i++) {        pthread_join(pool->threads[i], NULL);    }free(pool->threads);    pthread_mutex_destroy(&pool->mutex);    pthread_cond_destroy(&pool->cond);}

十一、把它套进外设通信场景


场景 1:CAN 收到报文后扔进线程池

任务参数

typedefstruct {int can_id;unsignedchar data[8];int dlc;can_msg_t;

处理函数

voidcan_process_task(void *arg){can_msg_t *msg = (can_msg_t *)arg;printf("worker: process CAN id=0x%X dlc=%d\n", msg->can_id, msg->dlc);// 例如:// 1. 解析设备地址// 2. 解析转速/温度/状态位// 3. 更新设备表// 4. 告警判断// 5. 上报业务层free(msg);}

CAN 接收线程

void *can_rx_thread(void *arg){thread_pool_t *pool = (thread_pool_t *)arg;while (1) {can_msg_t *msg = malloc(sizeof(can_msg_t));if (!msg) continue;// 这里模拟收到一帧 CAN        msg->can_id = 0x123;        msg->dlc = 8;for (int i = 0; i < 8; i++) msg->data[i] = i;        thread_pool_add_task(pool, can_process_task, msg);        usleep(100000);    }returnNULL;}

这就体现出:

  • CAN 线程负责“收”
  • 线程池负责“处理”

场景 2:UART 接收完整帧后投递任务

UART 的关键不是每个字节都丢到线程池,而是拼成完整协议帧后再投递

例如:

typedefstruct {unsignedchar *buf;int len;uart_frame_t;
voiduart_parse_task(void *arg){uart_frame_t *frame = (uart_frame_t *)arg;printf("worker: parse UART frame len=%d\n", frame->len);// 协议帧解析// 校验和// 命令字分发// 回复帧构造free(frame->buf);free(frame);}

UART 线程思路:

read bytes -> ring buffer -> detect full frame -> malloc frame -> add_task()

场景 3:RS485 Modbus 轮询

RS485 thread:  send request to slave 1  wait response  get full response frame  push "modbus decode task"Worker:  parse function code  parse register values  convert voltage/current/temp  update cache

发现:

通信时序控制在 RS485 线程里,数据业务处理在线程池里。

这个边界非常重要。


场景 4:I2C 传感器周期采样

I2C thread every 1s:  read 6 raw bytes from sensor  push taskWorker:  raw bytes -> checksum -> temp/humidity  moving average filter  alarm compare  publish

这种低速周期性设备非常适合这种模型。


场景 5:SPI ADC 高速采样

SPI thread:  read adc sample block every 10ms  push sample-processing taskWorker:  block average  denoise  threshold detect  save result

如果采样非常快,线程池大小和队列深度就要认真设计。


十二、线程池开发中的关键设计点


1. 线程池大小怎么定

不要盲目开很多线程。

通常依据:

  • CPU 核数
  • 任务类型(CPU 密集 or I/O 密集)
  • 最大并发量
  • 实时性要求

经验值

  • 纯计算型:线程数接近 CPU 核数
  • 混合型:核数 ~ 2 倍核数之间试验
  • 嵌入式设备:一般 2~8 个工作线程就很多了

例如双核 ARM 板子:

  • 线程池开 3~4 个常较合理

不是越多越好。


2. 队列必须有限长

嵌入式里最怕无边界。

如果队列无限增长:

  • 内存会爆
  • 延迟越来越大
  • 老数据失去意义

所以实际项目中通常要做:

  • 最大队列长度
  • 满了后的策略

常见策略

  • 丢弃最老任务
  • 丢弃最新任务
  • 高优先级任务插队
  • 记录告警日志

例如:

  • CAN 状态帧可丢旧的
  • 告警帧不可丢
  • 控制命令不可丢

3. 任务参数内存归属要清楚

例如不能这样:

void *uart_thread(void *arg){unsignedchar buf[256];    ...    thread_pool_add_task(pool, uart_parse_task, buf); // 错}

因为 buf 是栈上的,线程函数返回或循环覆盖后,工作线程拿到的是无效数据。

正确做法:

  • malloc 一份独立内存
  • 或使用对象池/内存池

4. 任务函数不要阻塞太久

如果线程池的 worker 里做了很慢的事情:

  • 数据库写盘 2 秒
  • 网络上传超时 5 秒
  • 等外设回复 1 秒

那么整个线程池就会被拖死。

所以一般原则:

线程池里的任务应当尽量短小、可控、快速完成。

慢任务最好:

  • 单独线程
  • 或分层异步化

5. 任务分类和优先级

实际项目里常把任务分级:

  • 高优先级:控制命令、告警
  • 中优先级:状态数据
  • 低优先级:日志、统计、历史存储

高级一点的线程池会做:

  • 多优先级队列
  • 不同类型任务走不同池

例如:

  • 控制任务池
  • 数据处理池
  • 日志池

6. 与 epoll/select 配合

在 Linux 外设/网络开发中,经常是:

  • I/O 多路复用线程负责监听多个 fd
  • 一旦某 fd 可读,读出数据并封装任务
  • 投递给线程池处理

这是一种经典架构:

epoll 负责事件驱动,线程池负责并发处理。

--

项目练手题

“小型多外设数据采集网关”。

需求

外设

  • UART:接一个模拟定位模块
  • RS485:接一个模拟 Modbus 温控器
  • CAN:接一个电机控制器模拟器
  • I2C:接温湿度传感器
  • SPI:接 ADC 芯片

功能

  • 各设备线程采集数据
  • 统一丢给线程池处理
  • 解析后写入全局设备状态表
  • 每秒打印一次所有设备状态

这样你会学到

  • 多线程分工
  • 外设通信结构设计
  • 线程池任务调度
  • 数据同步保护
  • 系统模块化

这比单独学 API 成长快得多。


十三、嵌入式 Linux 线程池开发最容易犯的错


错误 1:把线程池当“万能并发工具”

不是所有线程都该进池。 设备接收线程通常应该独立存在。


错误 2:任务里直接访问不安全共享资源

比如多个 worker 同时写全局状态表,却不加锁。


错误 3:任务参数传栈变量

这是经典 bug。


错误 4:线程池里做阻塞外设收发

worker 被长期占住,池子会失效。


错误 5:队列无上限

高峰期直接把系统拖死。


错误 6:不区分“数据采集”和“业务处理”

导致结构混乱,后续扩展困难。


十四、工程脑图

画面模型:

设备通信线程    ↓收完整数据 / 形成采样块 / 等到响应    ↓封装成任务对象    ↓投递线程池    ↓工作线程并行处理    ↓更新状态 / 告警 / 存储 / 上报

一句话总结:

设备线程负责“把数据拿回来”,线程池负责“把数据处理掉”。


十五、结论

线程池开发思想

  • 预创建多个工作线程
  • 用任务队列统一管理工作
  • 让任务和线程解耦
  • 控制资源,提高并发处理效率

在嵌入式 Linux 里的正确用法

  • 外设通信线程独立存在
  • 完整报文/采样结果作为任务投递到线程池
  • 线程池处理解析、计算、存储、上报

学习方法

  • 先学 pthread 线程同步
  • 再手写最小线程池
  • 再接 UART / RS485 / CAN / I2C / SPI 实战
  • 最后加入优先级、限流、监控、异常恢复

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-15 19:44:09 HTTP/2.0 GET : https://f.mffb.com.cn/a/486067.html
  2. 运行时间 : 0.112446s [ 吞吐率:8.89req/s ] 内存消耗:4,742.64kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=765763b9d1208572d76874d0541117de
  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.000687s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000779s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000393s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000309s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000533s ]
  6. SELECT * FROM `set` [ RunTime:0.000192s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000528s ]
  8. SELECT * FROM `article` WHERE `id` = 486067 LIMIT 1 [ RunTime:0.000552s ]
  9. UPDATE `article` SET `lasttime` = 1776253449 WHERE `id` = 486067 [ RunTime:0.015125s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000347s ]
  11. SELECT * FROM `article` WHERE `id` < 486067 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000546s ]
  12. SELECT * FROM `article` WHERE `id` > 486067 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000363s ]
  13. SELECT * FROM `article` WHERE `id` < 486067 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006557s ]
  14. SELECT * FROM `article` WHERE `id` < 486067 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001862s ]
  15. SELECT * FROM `article` WHERE `id` < 486067 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.009590s ]
0.114191s