当前位置:首页>python>第221讲:VBA和Python双方案,从离散日志到连续洞察:小休与离席时长的自动化统计

第221讲:VBA和Python双方案,从离散日志到连续洞察:小休与离席时长的自动化统计

  • 2026-04-20 19:47:10
第221讲:VBA和Python双方案,从离散日志到连续洞察:小休与离席时长的自动化统计

在客服中心的日常运营管理中,员工的工作状态管理是效率优化的关键环节。座席何时处于“小休”、何时“离席”、每次持续多久,这些数据不仅关乎个人考勤,更直接影响着排班的合理性、高峰时段的资源配置以及服务水平的达成。

然而,获取这些数据并非易事。系统记录的是离散的、一条条的“状态变更”日志,管理者面对的挑战是:如何将这些点状的记录,转化为连续的、可分析的“小休片段”与“离席时长”?本文将深入解析这一业务场景,并提供从 Excel VBA 到 Python 的两套自动化解决方案,让您从繁琐的手工计算中解放出来,精准洞察团队的时间利用。


一、 业务逻辑:从状态变更日志到有效工作时长

在技术实现前,必须理解原始数据的结构和我们期望的输出。

1. 原始数据(离散日志)示例

时间戳

座席ID

状态

2025-10-26 09:00:00

1001

就绪

2025-10-26 10:15:30

1001

小休

2025-10-26 10:30:00

1001

就绪

2025-10-26 11:20:00

1001

离席

2025-10-26 11:50:00

1001

就绪

...

...

...

2. 目标输出(聚合统计)示例

座席ID

日期

小休总时长(分钟)

离席总时长(分钟)

小休次数

1001

2025-10-26

14.5

30.0

1

3. 核心计算逻辑

  1. 数据排序:必须按座席ID时间戳升序排序,确保状态变更按时间顺序排列。

  2. 状态片段配对:一个有效的“小休”或“离席”片段,由一条“开始”记录(状态变为“小休”)和下一条“结束”记录(状态变为“就绪”或其他工作状态)配对而成。我们需要计算这两个时间戳的差值。

  3. 处理边界与异常

    • 跨天记录:小休可能跨天,通常我们按自然日进行统计,需要拆分。

    • 状态不连续:如果日志以“小休”开始或以“小休”结束(没有配对的结束记录),可能需要特殊处理(如使用当前时间或视为无效片段)。

    • 重复状态:连续两条“小休”记录是无效的,通常需要去重或取第一条。

因此,技术实现的核心是:在按员工分组并按时间排序的日志中,识别出每一对“开始-结束”状态变更,并计算其时间差,最后按员工和状态类型进行汇总。


二、 VBA实现:遍历、配对与累加

对于数据量不大、流程在Excel内固化的场景,VBA可以完成这项任务。其核心思路是:循环遍历已排序的日志,为每个员工寻找配对的“开始”和“结束”记录。

算法思路

  1. 数据排序:使用Excel的排序功能或VBA的Sort方法,按座席ID时间戳排序。

  2. 初始化与遍历:循环遍历每一行(从第2行开始)。我们需要跟踪当前员工、上一个状态,以及当遇到“小休”或“离席”开始时,记录其开始时间。

  3. 状态配对

    • 当状态变为“小休”或“离席”时,记录当前时间作为startTime,并记录状态类型statusType

    • 继续向后遍历,直到遇到同一员工的状态变为“就绪”、“通话中”等工作状态,或员工ID改变。此时,用DateDiff函数计算startTime与当前时间的差值,累加到该员工的对应状态总时长中。

  4. 汇总输出:将每个员工、每种状态的总时长输出到新的区域。

关键代码与注释

Sub CalculateBreakTimeVBA()    Dim wsLog As Worksheet, wsSummary As Worksheet    Dim lastRow As Long, i As Long, j As Long    Dim currentAgent As String, startAgent As String    Dim startTime As Date, endTime As Date    Dim breakType As String    Dim dict As Object ' 用于存储汇总结果    Dim key As String    Set wsLog = ThisWorkbook.Sheets("状态日志")    Set wsSummary = ThisWorkbook.Sheets.Add(After:=wsLog)    wsSummary.Name = "时长汇总"    Set dict = CreateObject("Scripting.Dictionary")    ' 1. 数据排序(假设A列=时间,B列=座席ID,C列=状态)    lastRow = wsLog.Cells(wsLog.Rows.Count, "A").End(xlUp).Row    wsLog.Range("A1:C" & lastRow).Sort Key1:=wsLog.Range("B1"), Order1:=xlAscending, _                                        Key2:=wsLog.Range("A1"), Order2:=xlAscending, _                                        Header:=xlYes    ' 2. 遍历日志,配对计算    i = 2    Do While i <= lastRow        currentAgent = wsLog.Cells(i, "B").Value        breakType = wsLog.Cells(i, "C").Value        ' 只处理“小休”或“离席”的开始事件        If breakType = "小休" Or breakType = "离席" Then            startTime = wsLog.Cells(i, "A").Value            startAgent = currentAgent            ' 寻找配对的结束事件(状态变为非“小休”/“离席”,或员工改变)            j = i + 1            Do While j <= lastRow                If wsLog.Cells(j, "B").Value <> startAgent Then                    ' 员工改变,视为无结束记录,通常不计入(或按异常处理)                    Exit Do                End If                If wsLog.Cells(j, "C").Value <> breakType Then                    ' 状态改变,找到结束点                    endTime = wsLog.Cells(j, "A").Value                    ' 计算时长(分钟)                    Dim duration As Double                    duration = DateDiff("n", startTime, endTime) ' "n" 表示分钟                    ' 生成汇总键:座席ID_状态_日期                    Dim dateStr As String                    dateStr = Format(startTime, "yyyy-mm-dd")                    key = startAgent & "_" & breakType & "_" & dateStr                    ' 累加到字典                    If dict.Exists(key) Then                        dict(key) = dict(key) + duration                    Else                        dict.Add key, duration                    End If                    ' 更新i,跳过已处理的结束行                    i = j                    Exit Do                End If                j = j + 1            Loop            ' 如果循环结束都没找到结束记录(例如日志以“小休”结束),可忽略或特殊处理        End If        i = i + 1    Loop    ' 3. 输出汇总结果    wsSummary.Range("A1:D1").Value = Array("座席ID""日期""状态""总时长(分钟)")    Dim outRow As Long: outRow = 2    For Each key In dict.Keys        Dim parts() As String        parts = Split(key, "_")        wsSummary.Cells(outRow, 1).Value = parts(0' 座席ID        wsSummary.Cells(outRow, 2).Value = parts(2) ' 日期        wsSummary.Cells(outRow, 3).Value = parts(1' 状态        wsSummary.Cells(outRow, 4).Value = dict(key) ' 总时长        outRow = outRow + 1    Next key    ' 4. 可选:按座席和日期透视汇总    wsSummary.Range("A1").CurrentRegion.Sort Key1:=wsSummary.Range("A1"), Order1:=xlAscending, _                                             Key2:=wsSummary.Range("B1"), Order2:=xlAscending, _                                             Header:=xlYes    MsgBox "小休/离席时长统计完成!", vbInformationEnd Sub

VBA方案评价

  • 优点:逻辑清晰,运行在Excel内,无需额外环境;适合处理小规模数据。

  • 缺点

    1. 性能瓶颈:内嵌循环(Do While j...)在最坏情况下(大量连续的状态记录)时间复杂度高,处理数万行日志时速度慢。

    2. 代码冗长:状态配对、边界条件处理(如跨天、无结束记录)的代码较为复杂。

    3. 难以应对复杂情况:如需按自然日拆分跨天的休息片段,逻辑会非常繁琐。


三、 Python实现:利用pandas的向量化与分组运算

对于日志数据量大、需要定期自动化分析,或计算逻辑复杂的场景,Python的pandas库是更强大、更优雅的工具。其核心是利用groupbyshift和布尔索引进行向量化运算,避免显式循环。

核心思路

  1. 数据清洗与排序:加载数据,确保时间列为datetime类型,并按座席ID时间戳排序。

  2. 识别状态片段

    • 在按座席ID分组的数据中,通过比较当前行状态与前一行状态,可以识别出状态变化的“边界”。

    • “小休开始” = (当前状态为“小休”) 且 (上一行状态不为“小休”或为其他)。

    • “小休结束” = (当前状态不为“小休”) 且 (上一行状态为“小休”)。

  3. 计算时长:将每个“开始”行与下一个“结束”行配对,计算时间差。这可以通过为每个“开始”行标记其对应的“结束”行索引,或通过shift计算下一个非休息状态的时间来实现。

  4. 汇总统计:将计算出的时长,按座席ID日期状态类型进行groupby求和。

完整、健壮的代码实现

import pandas as pdimport numpy as npfrom datetime import datetime, timedeltadef calculate_break_durations(df_log, agent_col='座席ID', time_col='时间戳', status_col='状态', break_types=None):    """    从状态变更日志计算小休/离席时长。    参数:    df_log: 日志DataFrame    agent_col: 座席ID列名    time_col: 时间戳列名    status_col: 状态列名    break_types: 需要统计的休息状态列表,如['小休', '离席']    返回:    两个DataFrame: (时长明细, 汇总统计)    """    if break_types is None:        break_types = ['小休''离席']    df = df_log.copy()    # 1. 数据预处理    df[time_col] = pd.to_datetime(df[time_col])    df = df.sort_values(by=[agent_col, time_col]).reset_index(drop=True)    df['日期'] = df[time_col].dt.date  # 用于按日汇总    # 2. 识别休息开始和结束    # 在分组内,判断状态是否发生变化    df['prev_status'] = df.groupby(agent_col)[status_col].shift(1)    df['next_time'] = df.groupby(agent_col)[time_col].shift(-1)    df['next_status'] = df.groupby(agent_col)[status_col].shift(-1)    # 条件:休息开始 = 当前状态是休息,且上一个状态不是休息(或是工作状态,或是NaN即第一条记录)    break_start_condition = df[status_col].isin(break_types) & (df['prev_status'] != df[status_col])    # 条件:休息结束 = 当前状态是休息,且下一个状态不是休息(或是工作状态,或是NaN即最后一条记录)    break_end_condition = df[status_col].isin(break_types) & (df['next_status'] != df[status_col])    # 提取休息开始和结束的行    df_start = df[break_start_condition].copy()    df_end = df[break_end_condition].copy()    # 为开始和结束行配对(它们在同一分组内且按时间顺序一一对应)    # 这里我们假设日志记录完整,每个开始都有对应的结束。    # 更严谨的做法是匹配开始和结束的索引    df_start['end_time'] = df_end[time_col].values    df_start['duration_minutes'] = (df_start['end_time'] - df_start[time_col]).dt.total_seconds() / 60    # 3. 处理跨天片段:将一个跨天的休息拆分为多天    def split_cross_day_records(row):        """如果休息跨天,将其拆分为多条记录,每条记录属于一天"""        start = row[time_col]        end = row['end_time']        status = row[status_col]        agent = row[agent_col]        records = []        current_day = start.date()        end_day = end.date()        while current_day <= end_day:            day_start = max(start, pd.Timestamp(datetime.combine(current_day, datetime.min.time())))            day_end = min(end, pd.Timestamp(datetime.combine(current_day, datetime.max.time())))            if day_start < day_end:  # 确保当天有 duration                duration = (day_end - day_start).total_seconds() / 60                records.append({                    agent_col: agent,                    '日期': current_day,                    status_col: status,                    'start_time': day_start,                    'end_time': day_end,                    'duration_minutes': duration                })            current_day += timedelta(days=1)        return records    detailed_records = []    for _, row in df_start.iterrows():        detailed_records.extend(split_cross_day_records(row))    df_detailed = pd.DataFrame(detailed_records)    # 4. 汇总统计    if not df_detailed.empty:        summary = df_detailed.groupby([agent_col, '日期', status_col])['duration_minutes'].agg(['sum''count']).reset_index()        summary = summary.rename(columns={'sum''总时长_分钟''count''次数'})        # 更友好的透视表格式        pivot_summary = summary.pivot_table(index=[agent_col, '日期'],                                             columns=status_col,                                             values='总时长_分钟'                                            aggfunc='sum'                                            fill_value=0).reset_index()    else:        # 如果没有休息记录,创建空的结果DataFrame        summary = pd.DataFrame(columns=[agent_col, '日期', status_col, '总时长_分钟''次数'])        pivot_summary = pd.DataFrame(columns=[agent_col, '日期'] + break_types)    return df_detailed, summary, pivot_summary# --- 模拟数据生成与函数调用 ---# 创建模拟状态日志np.random.seed(221)num_records = 5000agents = ['A1001''A1002''A1003''A1004''A1005']statuses = ['就绪''小休''离席''通话中']# 生成随机时间序列和状态转移log_data = []current_time = pd.Timestamp('2023-10-26 08:00:00')for _ in range(num_records):    agent = np.random.choice(agents)    # 随机状态,但增加连续相同状态的可能性,模拟真实场景    if log_data and log_data[-1]['座席ID'] == agent and np.random.rand() > 0.3:        status = log_data[-1]['状态']  # 70%概率状态不变    else:        status = np.random.choice(statuses, p=[0.50.20.10.2])  # 概率权重    # 时间递增,间隔随机    time_increment = np.random.exponential(scale=300)  # 平均5分钟    current_time += pd.Timedelta(seconds=time_increment)    log_data.append({        '时间戳': current_time,        '座席ID': agent,        '状态': status    })df_log = pd.DataFrame(log_data)print("原始状态日志(前20行):")print(df_log.head(20))# 调用函数进行计算df_detail, df_summary, df_pivot = calculate_break_durations(df_log, break_types=['小休''离席'])print("\n" + "="*60)print("休息时长明细(前10条):")print(df_detail.head(10))print("\n" + "="*60)print("按座席、日期、状态的汇总:")print(df_summary.head(20))print("\n" + "="*60)print("透视表形式汇总(更易读):")print(df_pivot.head(20))# 保存结果df_detail.to_csv('休息时长明细.csv', index=False, encoding='utf-8-sig')df_summary.to_csv('休息时长汇总.csv', index=False, encoding='utf-8-sig')df_pivot.to_csv('休息时长透视表.csv', index=False, encoding='utf-8-sig')

代码核心优势解析

  1. 向量化高效运算:通过shift、布尔索引和groupby,避免Python级循环,即使处理百万行日志也速度极快。

  2. 优雅处理复杂情况

    • 跨天拆分split_cross_day_records函数能精确地将一个跨越多天的休息片段,拆分为多条按天的记录,确保每日统计准确。

    • 状态连续性:通过比较当前状态与前后状态,能准确识别片段的开始与结束,不受无效重复记录干扰。

  3. 输出丰富:不仅提供总计时长,还提供每次休息的明细、次数,以及易于阅读的透视表格式,满足不同分析需求。

  4. 健壮性:代码考虑了各种边界情况(如无休息记录、日志不完整),并通过清晰的函数封装,易于维护和扩展。


四、 方案对比与演进建议

维度

Excel VBA 方案

Python (pandas) 方案

开发速度

中,需编写和调试循环逻辑

中,但代码更简洁,逻辑更集中

运行性能

差,万行以上数据体验不佳

极佳,可轻松处理数十万乃至百万行日志

处理复杂度

低,实现基本配对已不易,处理跨天等复杂情况代码冗长易错

,可优雅处理跨天拆分、异常日志清洗、多维度分析

可维护性

低,过程式代码,修改和调试困难

,函数模块化,逻辑清晰,注释友好

输出与分析

基础汇总,进一步分析需手动操作

丰富,可一键生成明细、汇总、透视表及可视化图表

自动化集成

弱,依赖Excel手动触发

,可作为独立脚本集成到自动化流程,定时生成报告

选型建议

  • 选择Excel/VBA:如果你的数据量很小(<5000行),且这是一次性或不频繁的分析任务,团队完全依赖Excel,并且没有资源学习新工具。

  • 选择Python:如果你需要处理持续产生的大规模日志,追求高度的自动化与可复现性,需要应对复杂的业务规则(如跨天、多种休息类型),或希望将结果无缝集成到数据看板、邮件报表系统中。这是构建专业化运营分析体系的基石。


五、 从统计到洞察:驱动运营优化

计算出准确的休息时长只是第一步,关键在于如何使用这些数据:

  1. 考勤合规监控:对比公司规定的休息时长,识别异常(如过短或过长的离席),进行管理干预。

  2. 排班优化:分析团队整体的休息时段分布,识别高峰期休息人数是否过多,优化排班规则,确保服务水准。

  3. 坐席负荷与福祉:结合通话量数据,分析高负荷坐席的休息是否充足。休息不足可能是 burnout 的前兆,需及时关注。

  4. 流程改进:如果“离席”处理内部事务的时长占比过高,可能意味着线下流程繁琐,需要推动流程优化,将座席时间释放到服务客户中。

记住,时间是最宝贵的资源。自动化统计不是目的,而是为了更精准地度量、分析并优化这份资源的配置,最终实现客户体验与员工效能的平衡。


知识检验:5道选择题

  1. 在处理状态日志以计算休息时长时,首要的、必不可少的数据预处理步骤是什么?

    A) 删除所有状态为“就绪”的记录

    B) 将数据按座席ID时间戳进行升序排序

    C) 为每个座席生成一个随机编号

    D) 将时间戳转换为字符串格式

  2. 在Python的pandas实现中,df.groupby('座席ID')['状态'].shift(1)这行代码的主要作用是什么?

    A) 计算每个座席的状态变化次数

    B) 获取每个座席分组内,当前行的前一行的状态

    C) 将状态列的所有值上移一行

    D) 计算每个状态的持续时间

  3. 在VBA的双重循环算法中,当内层循环寻找某个“小休”开始记录的结束点时,如果遇到的下一条记录座席ID不同,最合理的处理方式是什么?

    A) 继续循环,忽略座席ID的变化

    B) 将当前系统时间作为结束时间进行计算

    C) 停止内层循环,将该次“小休”视为无效片段(无配对结束记录)而忽略

    D) 抛出错误并终止程序

  4. 在真实的业务场景中,一个“小休”片段可能从前一天晚上23:50开始,到第二天00:10结束。在按自然日统计小休时长时,应如何正确处理?

    A) 将整个20分钟计入第一天

    B) 将整个20分钟计入第二天

    C) 将其拆分为两条记录:第一天10分钟,第二天10分钟,分别计入对应日期

    D) 忽略此类跨天记录

  5. 对比两种实现,pandas方案通过shift和向量化运算来替代VBA的显式循环,这带来的最显著优势是什么?

    A) 代码的行数大大减少

    B) 极大地提升了大数据量下的计算性能

    C) 使代码可以在任何操作系统上运行

    D) 计算结果100%准确无误


答案

  1. B。排序是后续所有逻辑(无论是循环配对还是shift比较)的基础。只有数据按员工和时间有序,才能正确判断状态的先后顺序和归属关系。

  2. B。shift(1)在分组后使用,会为每个分组内的每一行,生成其前一行的值。这对于检测状态是否发生变化(当前状态 ≠ 前一个状态)至关重要,是识别休息开始和结束事件的核心操作。

  3. C。这是处理数据不完整或日志异常的合理方式。如果座席ID改变,意味着当前“小休”记录没有在后续日志中找到同一座席的结束记录。在无法获取准确结束时间的情况下,通常保守处理,忽略此片段,以避免统计误差。更完善的系统可能需要记录此类异常供人工核查。

  4. C。为了得到准确的每日统计,跨天的休息片段必须按自然日边界进行拆分。这是业务分析(如每日考勤、效率报表)的常见要求。示例代码中的split_cross_day_records函数演示了如何实现。

  5. B。pandas的向量化操作利用底层高度优化的C/Fortran库(如NumPy)在连续的内存块上进行计算,避免了Python解释器级别的逐元素循环,这在处理大规模数据时带来了几个数量级的性能提升,是两者最核心的区别。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-21 01:06:48 HTTP/2.0 GET : https://f.mffb.com.cn/a/484554.html
  2. 运行时间 : 0.088014s [ 吞吐率:11.36req/s ] 内存消耗:4,833.90kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c74ff23794e38ea4c223a4371400b4a6
  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.000607s ] 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.000340s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000272s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000477s ]
  6. SELECT * FROM `set` [ RunTime:0.000252s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000501s ]
  8. SELECT * FROM `article` WHERE `id` = 484554 LIMIT 1 [ RunTime:0.000521s ]
  9. UPDATE `article` SET `lasttime` = 1776704808 WHERE `id` = 484554 [ RunTime:0.006241s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000227s ]
  11. SELECT * FROM `article` WHERE `id` < 484554 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000453s ]
  12. SELECT * FROM `article` WHERE `id` > 484554 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000410s ]
  13. SELECT * FROM `article` WHERE `id` < 484554 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000669s ]
  14. SELECT * FROM `article` WHERE `id` < 484554 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002366s ]
  15. SELECT * FROM `article` WHERE `id` < 484554 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.007713s ]
0.089632s