当前位置:首页>java>拒绝学生化编程——有限状态机

拒绝学生化编程——有限状态机

  • 2026-02-05 00:45:38
拒绝学生化编程——有限状态机
企业级嵌入式开发领域,有限状态机(Finite State Machine,简称FSM)是构建高可靠性、高可维护性软件体系的核心基石。不同于简单的线性逻辑编程,工业场景下的设备与系统,往往需要应对复杂的状态切换、异常处理、时序控制等核心需求——从工业机器人的动作流程管控,到智能传感器的工作模式切换,再到工业网关的通信状态管理,几乎所有核心业务逻辑的落地,都离不开一套健壮、可扩展的状态机设计。
缺乏规范状态机支撑的工业代码,往往会陷入“面条式逻辑”的困境:大量嵌套的条件分支、零散的状态判断、无序的流程跳转,不仅会导致代码可读性差、维护成本飙升,更会在工业现场复杂的工况下,引发不可预测的逻辑漏洞,甚至造成设备故障、生产中断等严重后果。而一个设计精良的状态机,能够将系统的所有行为抽象为“状态”与“状态流转规则”,通过明确的“进入(Entry)- 执行(Action)- 退出(Exit)”三阶段生命周期管理,让每个状态的职责边界清晰、状态间的切换逻辑可追溯,从根本上保障代码的健壮性与可测试性,适配工业级嵌入式开发的严苛要求。
因此,本期内容将从实战角度出发,详细讲解企业级嵌入式开发中状态机的核心设计范式,最后结合完整实例拆解,帮助大家掌握在实际项目中嵌入状态机的思路与方法,为后续开发提供可直接参考的模板。

一、状态机设计的核心前提:明确系统状态与流转逻辑

在实际嵌入式开发中,要设计出贴合项目需求的状态机,首要任务是理清三个核心问题:项目需要多少个核心状态、状态之间的切换流程是什么、每种状态的生命周期如何管理。而流程图,正是梳理这些问题、落地状态机设计的关键工具——它能将抽象的状态与流转逻辑可视化,避免后续代码开发陷入逻辑混乱。
为了让大家快速理解,我们先绘制一个简化的嵌入式设备状态流程图(如上图所示),该流程图仅定义了三个最基础且通用的核心状态:空闲(Ready)、运行(Running)、错误(ERROR),同时明确了每种核心状态对应的“进入-执行-退出”子状态(即生命周期阶段)。
讲到这里,很多新手可能会有一个误区:认为“空闲状态”就意味着设备不执行任何操作,因此只需处理“进入空闲”和“退出空闲”两个事件即可。实则不然——设备在空闲态并非完全“闲置”,只是其执行的操作不影响核心业务功能,更多是用于“监听触发条件”,为状态切换做准备。
我们举一个贴近生活的工业设备类比:一个具备加热功能的工业恒温水杯,其核心业务是“加热至指定温度”。我们可以将其抽象为两个核心状态:空闲态(未执行加热动作)、运行态(加热中)。那么这个水杯在空闲态会做什么?答案是“持续检测触发条件”——比如监听水杯上的启动按键,判断是否有用户按下;同时可能检测当前水温,确认是否需要再次启动加热。这些“不影响核心加热功能,但保障状态正常切换”的操作,就是空闲态的“执行事件”。
这里需要强调一个关键规则:状态的切换并非随机发生,仅当“执行阶段(Action)”判定满足切换条件时,才会触发当前状态的“退出阶段(Exit)”,进而进入下一个状态的“进入阶段(Entry)”,确保状态流转的有序性。

二、状态机的核心结构体设计:用代码封装生命周期

明确状态与流转逻辑后,我们需要用代码将其封装,让状态机的生命周期可管理、可扩展。在嵌入式C语言开发中,通常通过“子状态机结构体”(封装单个状态的生命周期)和“全局状态机结构体”(管理所有核心状态)来实现,以下是标准化的结构体设计方案。

2.1 子状态机结构体:封装单个状态的生命周期

子状态机的核心作用,是绑定单个核心状态(如Ready)与其对应的“进入-执行-退出”三阶段回调函数,明确每个阶段的执行逻辑。其中,进入(Entry)和退出(Exit)阶段仅执行操作、无返回值;执行(Action)阶段需判断是否切换状态,因此有返回值(目标状态)。
// 无返回值的回调函数(用于Entry/Exit阶段,仅执行操作)typedefvoid(*EVENT)(void);// 有返回值的回调函数(用于Action阶段,返回目标状态,决定是否切换状态)typedefdevFSMState_t(*ACTION)(void);// 子状态机结构体:封装单个核心状态的生命周期typedef struct devFSMStateStructType{    unsigned char curState;  // 当前绑定的核心状态(READY/RUNNING/ERROR)    unsigned char subState;  // 当前执行阶段(ENTRY/ACTION/EXIT)    EVENT entry;             // 进入阶段回调函数(状态激活时执行)    ACTION action;           // 执行阶段回调函数(状态持续运行时执行)    EVENT exit;              // 退出阶段回调函数(状态切换前执行)} SubFSMState_t;

2.2 全局状态机结构体:管理所有核心状态

全局状态机用于统一管理系统中所有的核心状态,通过子状态机数组,将每个核心状态与对应的子状态机关联,同时记录设备当前所处的核心状态,方便后续调度。
#define DEV_FSM_STATE_CAP 3  // 状态容量(对应3个核心状态:READY/RUNNING/ERROR)// 全局状态机结构体:管理所有核心状态及其子状态机typedef struct devFSMStructType{    unsigned char state;             // 设备当前所处的核心状态    SubFSMState_t subFSM[DEV_FSM_STATE_CAP];  // 子状态机数组(一一对应核心状态)} DevFSM_t;

三、状态机核心逻辑实现:初始化、注册与调度

结构体设计完成后,接下来实现状态机的三大核心操作:初始化(启动状态机)、回调函数注册(绑定状态与执行逻辑)、执行调度(周期性运行状态机)。这三部分逻辑是状态机正常工作的基础,需严格遵循“初始化→注册→调度”的执行顺序。

3.1 初始化:重置状态,绑定核心状态与子状态机

初始化的核心目的,是将所有子状态机重置为初始状态(进入阶段ENTRY),绑定每个子状态机与对应的核心状态,并设置设备的初始核心状态(通常为空闲态READY),为后续状态流转做好准备。
// 全局状态机实例(供整个系统调用)DevFSM_t DevFSM;voidDevFSM_Init(void){    // 1. 初始化所有子状态机:阶段重置为ENTRY,回调函数置空(避免野指针)    for (int i = 0; i < DEV_FSM_STATE_CAP; i++)    {        DevFSM.subFSM[i].subState = DEV_FSM_STAGE_ENTRY;        DevFSM.subFSM[i].entry = NULL;        DevFSM.subFSM[i].action = NULL;        DevFSM.subFSM[i].exit = NULL;    }    // 2. 绑定子状态机与核心状态(一一对应,确保调度时能精准定位)    DevFSM.subFSM[DEV_FSM_INDEX_READY].curState = DEV_STATE_READY;    DevFSM.subFSM[DEV_FSM_INDEX_RUNNING].curState = DEV_STATE_RUNNING;    DevFSM.subFSM[DEV_FSM_INDEX_ERROR].curState = DEV_STATE_ERROR;    // 3. 设置设备初始状态为READY(空闲态,符合嵌入式设备启动逻辑)    DevFSM.state = DEV_STATE_READY;}

3.2 回调函数注册:灵活配置每个状态的执行逻辑

注册函数的核心作用,是将我们自定义的“进入-执行-退出”回调函数,绑定到对应的子状态机上。这样设计的优势的是“解耦”——后续修改某个状态的执行逻辑时,只需修改对应的回调函数,无需改动状态机核心调度代码,大幅提升可维护性。
// 状态机回调函数注册:为指定核心状态绑定Entry/Exit/Action回调void DevFSM_SetFSMEvent(unsigned char state, EVENT entry, EVENT exit, ACTION action){    switch(state)    {        case DEV_STATE_READY:  // 绑定空闲态回调函数            DevFSM.subFSM[DEV_FSM_INDEX_READY].entry = entry;            DevFSM.subFSM[DEV_FSM_INDEX_READY].action = action;            DevFSM.subFSM[DEV_FSM_INDEX_READY].exit = exit;            break;        case DEV_STATE_RUNNING:  // 绑定运行态回调函数            DevFSM.subFSM[DEV_FSM_INDEX_RUNNING].entry = entry;            DevFSM.subFSM[DEV_FSM_INDEX_RUNNING].action = action;            DevFSM.subFSM[DEV_FSM_INDEX_RUNNING].exit = exit;            break;        case DEV_STATE_ERROR:  // 绑定错误态回调函数            DevFSM.subFSM[DEV_FSM_INDEX_ERROR].entry = entry;            DevFSM.subFSM[DEV_FSM_INDEX_ERROR].action = action;            DevFSM.subFSM[DEV_FSM_INDEX_ERROR].exit = exit;            break;        default:  // 无效状态,不做操作(避免异常)            break;    }}

3.3 执行调度:状态机的核心“大脑”

状态机执行调度函数,是整个状态机的核心,需在嵌入式系统的主循环、定时器中断或单独线程中周期性调用(调用周期根据项目需求设定,如500ms/次)。其核心逻辑分为两步:定位当前子状态机、按生命周期阶段执行回调函数。
这里有一个关键设计:进入阶段(ENTRY)执行完成后,不添加break语句,直接无缝进入执行阶段(ACTION),确保状态生命周期的连续性;只有当执行阶段判定需要切换状态时,才会进入退出阶段(EXIT),完成当前状态的清理后,重置为进入阶段,等待下一次状态激活。
还有两点我想说明下,首先我在执行阶段会判断执行事件的返回值,通过返回值来确认是否需要进行状态切换,第二点就是可以看到事件并不是必须要定义的,例如我并不想定义空闲的进入事件,那么我完全可以定义空闲的进入事件为NULL
// 状态机核心调度函数:周期性执行,实现状态流转voidDevFSM_Execute(void){    devFSMState_t state;  // 存储Action阶段返回的目标状态    int index;            // 用于定位当前状态对应的子状态机索引    // 步骤1:定位当前核心状态对应的子状态机(遍历子状态机数组)    for (index = 0; index < DEV_FSM_STATE_CAP; index++)    {        if (DevFSM.subFSM[index].curState != DevFSM.state)        {            continue;  // 跳过不匹配的子状态机        }        break;  // 找到匹配的子状态机,退出遍历    }    // 步骤2:按“ENTRY-ACTION-EXIT”阶段执行回调函数    switch (DevFSM.subFSM[index].subState)    {        case DEV_FSM_STAGE_ENTRY:            // 执行进入阶段回调(如初始化状态相关资源)            if (DevFSM.subFSM[index].entry != NULL)            {                DevFSM.subFSM[index].entry();            }            // 进入阶段完成后,无缝切换到执行阶段(无break)            DevFSM.subFSM[index].subState = DEV_FSM_STAGE_ACTION;        case DEV_FSM_STAGE_ACTION:            // 执行核心业务逻辑(如监听触发条件、执行任务)            if (DevFSM.subFSM[index].action != NULL)            {                state = DevFSM.subFSM[index].action();                // 若返回的目标状态与当前状态不同,触发状态切换(进入EXIT阶段)                if (state != DevFSM.subFSM[index].curState)                {                    DevFSM.state = state;  // 更新全局核心状态                    DevFSM.subFSM[index].subState = DEV_FSM_STAGE_EXIT;                    break;  // 退出当前switch,下次调度执行EXIT阶段                }            }            break;  // 若无需切换状态,保持在ACTION阶段,下次调度继续执行        case DEV_FSM_STAGE_EXIT:            // 执行退出阶段回调(如清理状态相关资源)            if (DevFSM.subFSM[index].exit != NULL)            {                DevFSM.subFSM[index].exit();            }            // 退出阶段完成后,重置为ENTRY阶段,等待下一次状态激活            DevFSM.subFSM[index].subState = DEV_FSM_STAGE_ENTRY;            break;        default:            break;    }}

四、实战实例:状态机在嵌入式设备中的完整应用

结合上面的结构体设计和核心逻辑,我们以“简化版工业恒温水杯”为例,实现一个完整的状态机应用实例。实例中,我们将完善Ready态和Running态的回调函数,模拟设备的状态流转过程,同时补充Error态的基础实现,让整个实例更贴合实际开发场景。

4.1 各状态回调函数实现

回调函数是状态机的“业务逻辑载体”,我们根据每个状态的职责,实现对应的进入、执行、退出逻辑(用printf打印日志,模拟业务执行;用Sleep模拟耗时操作,贴合嵌入式设备实际工况)。
// 提前声明状态枚举(实际开发中建议放在头文件中)typedef enum {    DEV_STATE_READY = 0,    // 空闲态    DEV_STATE_RUNNING = 1,  // 运行态(加热中)    DEV_STATE_ERROR = 2     // 错误态(如水温异常)} devFSMState_t;// 提前声明阶段枚举typedef enum {    DEV_FSM_STAGE_ENTRY = 0,  // 进入阶段    DEV_FSM_STAGE_ACTION = 1// 执行阶段    DEV_FSM_STAGE_EXIT = 2    // 退出阶段} devFSMStage_t;// 提前声明子状态机索引(与核心状态一一对应)#define DEV_FSM_INDEX_READY 0#define DEV_FSM_INDEX_RUNNING 1#define DEV_FSM_INDEX_ERROR 2// (结构体定义、全局状态机实例、初始化/注册/调度函数,此处省略,同前文)// -------------------------- Ready状态回调函数(空闲态)--------------------------// 进入Ready态:模拟空闲态初始化(如重置水温检测标志)staticvoidDevFSM_EntryReady(void){    printf("[ READY ]: 进入空闲态,初始化水温检测模块...\r\n");    Sleep(500);  // 模拟初始化耗时(嵌入式环境可替换为delay_ms(500))}// 退出Ready态:模拟空闲态资源清理(如停止水温预检测)staticvoidDevFSM_ExitReady(void){    printf("[ READY ]: 退出空闲态,停止水温预检测...\r\n");    Sleep(500);  // 模拟清理耗时}// 执行Ready态:模拟监听启动按键(核心逻辑),满足条件则切换到Running态static devFSMState_t DevFSM_ActionReady(void){    devFSMState_t targetState = DEV_STATE_READY;  // 默认保持空闲态    static int keyPressCount = 0;  // 模拟按键按下次数(仅用于演示)    // 模拟业务逻辑:每执行3次,模拟按键被按下(触发状态切换)    keyPressCount++;    printf("[ READY ]: 执行空闲态逻辑,监听启动按键(第%d次检测)...\r\n", keyPressCount);    Sleep(3000);  // 模拟检测周期(每3秒检测一次按键)    if (keyPressCount >= 3)    {        printf("[ READY ]: 检测到启动按键按下,准备切换到加热态(Running)...\r\n");        targetState = DEV_STATE_RUNNING;  // 切换到运行态        keyPressCount = 0;  // 重置按键计数    }    return targetState;  // 返回目标状态}// -------------------------- Running状态回调函数(加热中)--------------------------// 进入Running态:模拟加热模块初始化(如启动加热管)staticvoidDevFSM_EntryRunning(void){    printf("[ RUNNING ]: 进入加热态,启动加热管,开始加热...\r\n");    Sleep(1000);  // 模拟加热管启动耗时}// 退出Running态:模拟加热模块关闭(如关闭加热管)staticvoidDevFSM_ExitRunning(void){    printf("[ RUNNING ]: 退出加热态,关闭加热管,停止加热...\r\n");    Sleep(1000);  // 模拟加热管关闭耗时}// 执行Running态:模拟加热过程,检测水温,达标则切换回Ready态static devFSMState_t DevFSM_ActionRunning(void){    devFSMState_t targetState = DEV_STATE_RUNNING;  // 默认保持加热态    static int temperature = 25;  // 模拟初始水温(25℃)    // 模拟加热逻辑:每次执行水温升高10℃,达到85℃则停止加热(切换回空闲态)    temperature += 10;    printf("[ RUNNING ]: 执行加热逻辑,当前水温:%d℃(目标85℃)...\r\n", temperature);    Sleep(3000);  // 模拟加热周期(每3秒检测一次水温)    if (temperature >= 85)    {        printf("[ RUNNING ]: 水温达到目标(85℃),准备切换回空闲态(Ready)...\r\n");        targetState = DEV_STATE_READY;  // 切换回空闲态        temperature = 25;  // 重置水温(模拟下次加热)    }    // 模拟错误处理:若水温异常过高(超过100℃),切换到Error态(此处简化处理)    if (temperature > 100)    {        printf("[ RUNNING ]: 警告!水温异常过高(%d℃),切换到错误态(Error)...\r\n", temperature);        targetState = DEV_STATE_ERROR;    }    return targetState;}// -------------------------- Error状态回调函数(错误态)--------------------------// 进入Error态:模拟错误提示(如点亮报警灯)staticvoidDevFSM_EntryError(void){    printf("[ ERROR ]: 进入错误态,点亮报警灯,提示水温异常!\r\n");    Sleep(500);}// 退出Error态:模拟错误解除(如熄灭报警灯)staticvoidDevFSM_ExitError(void){    printf("[ ERROR ]: 退出错误态,熄灭报警灯,错误已解除...\r\n");    Sleep(500);}// 执行Error态:模拟错误处理(如持续报警,等待人工干预)static devFSMState_t DevFSM_ActionError(void){    printf("[ ERROR ]: 执行错误态逻辑,持续报警,等待人工干预...\r\n");    Sleep(5000);  // 模拟报警周期(每5秒提示一次错误)    // 简化处理:此处默认等待人工干预后,切换回空闲态(实际开发可根据需求修改)    static int errorCount = 0;    errorCount++;    if (errorCount >= 2)    {        printf("[ ERROR ]: 人工干预解除错误,准备切换回空闲态(Ready)...\r\n");        errorCount = 0;        return DEV_STATE_READY;    }    return DEV_STATE_ERROR;  // 默认保持错误态}

五、实战开发注意事项

通过上述实例,我们可以发现:企业级嵌入式开发中,状态机的核心价值在于“解耦”和“规范”——将复杂的业务逻辑拆分为一个个独立的状态,每个状态的职责单一,状态间的切换逻辑可追溯。结合实战经验,补充几个关键注意事项,帮助大家规避常见坑:
状态划分要“精准适度”:核心状态不宜过多(避免状态机复杂度过高),也不宜过少(避免状态职责模糊);优先划分“稳定的核心状态”,再考虑细分辅助状态。
回调函数要“职责单一”:Entry阶段仅做“状态激活相关的初始化”,Exit阶段仅做“状态退出相关的清理”,Action阶段仅做“核心业务逻辑与状态判断”,避免一个回调函数处理过多逻辑。
异常处理要“全面”:必须为Error态设计完整的回调逻辑,同时在每个状态的Action阶段,增加异常检测(如资源异常、信号异常),确保系统能从异常状态中恢复,或进入安全状态。
调度周期要“合理”:根据业务需求设定调度周期,周期过短会占用过多CPU资源,周期过长会导致状态切换不及时,建议结合设备工况(如检测频率、任务耗时)动态调整。

总结

企业级嵌入式开发中,状态机并非“可选功能”,而是保障软件健壮性、可维护性的“必备工具”。本文从状态机的核心价值出发,梳理了“明确状态逻辑→设计结构体→实现核心调度→落地实战实例”的完整设计流程,核心是通过“状态封装”和“生命周期管理”,解决工业场景下复杂流程的管控问题。
实际开发中,大家无需拘泥于本文的简化实例,可根据项目需求(如多状态、嵌套状态机、异步事件触发)灵活扩展——比如增加状态流转的条件判断、完善异常处理逻辑、引入状态机框架(如QM)提升开发效率。但无论如何扩展,“状态清晰、职责单一、流转可控”这三个核心原则,始终是状态机设计的关键,也是避开“面条式逻辑”、构建高可靠嵌入式软件的核心前提。
本期最后,如果大家在最后有不明白的地方欢迎加入Q群:1082401078 一起交流分享,更多资料也可以进群获取。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 13:41:50 HTTP/2.0 GET : https://f.mffb.com.cn/a/471399.html
  2. 运行时间 : 0.155773s [ 吞吐率:6.42req/s ] 内存消耗:4,498.92kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0edf466a45f55744f9c4fece0bb71583
  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.000413s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000816s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000271s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000275s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000473s ]
  6. SELECT * FROM `set` [ RunTime:0.000206s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000489s ]
  8. SELECT * FROM `article` WHERE `id` = 471399 LIMIT 1 [ RunTime:0.004857s ]
  9. UPDATE `article` SET `lasttime` = 1770442910 WHERE `id` = 471399 [ RunTime:0.007743s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.001959s ]
  11. SELECT * FROM `article` WHERE `id` < 471399 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000493s ]
  12. SELECT * FROM `article` WHERE `id` > 471399 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001413s ]
  13. SELECT * FROM `article` WHERE `id` < 471399 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.021204s ]
  14. SELECT * FROM `article` WHERE `id` < 471399 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.012990s ]
  15. SELECT * FROM `article` WHERE `id` < 471399 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.035866s ]
0.157484s