当前位置:首页>python>第346讲:Python和VBA实现文件夹监控与自动触发处理

第346讲:Python和VBA实现文件夹监控与自动触发处理

  • 2026-08-21 11:21:34
第346讲:Python和VBA实现文件夹监控与自动触发处理

场景:监控指定文件夹,新文件进入后自动处理

在日常办公自动化中,我们经常会遇到这样的需求:某个文件夹里一旦有新的文件放入,系统就自动对其进行重命名、解析内容、移动到指定目录或者触发一段数据处理流程。比如财务部门每天定时接收银行流水Excel,或者运维人员需要实时捕获日志文件的变化。

实现这类功能,Python和VBA是两条常见的技术路线。Python通常采用watchdog库实现事件驱动,而VBA则多依赖Application.OnTime进行定时轮询。这两种机制在架构设计、资源占用和开发复杂度上有着本质区别。本文不仅会带你深入理解两者的实现方式,还会提供完整的代码对比和实战干货,帮你根据实际场景做出最合适的技术选型。


一、Python 事件驱动:watchdog 库监听文件变化

1. watchdog 核心原理

watchdog是Python中专门用于监控文件系统事件的第三方库。它能在操作系统层面监听指定目录,当发生文件创建、修改、删除、移动等事件时,立即触发对应的回调函数。这种机制是事件驱动的——就像你家里的门铃,有人按门铃你才去开门,而不是每隔5秒跑去看一次门口有没有人。

2. 安装与基础使用

首先安装库:

pip install watchdog

一个最基础的文件夹监控示例:

from watchdog.observers import Observerfrom watchdog.events import FileSystemEventHandlerimport timeimport osclass MyHandler(FileSystemEventHandler):    def on_created(self, event):        if not event.is_directory:            print(f"检测到新文件: {event.src_path}")            # 这里写你的文件处理逻辑            self.process_file(event.src_path)    def on_modified(self, event):        if not event.is_directory:            print(f"文件被修改: {event.src_path}")    def on_moved(self, event):        if not event.is_directory:            print(f"文件被移动/重命名: 从 {event.src_path} 到 {event.dest_path}")    def on_deleted(self, event):        if not event.is_directory:            print(f"文件被删除: {event.src_path}")    def process_file(self, file_path):        """自定义文件处理方法"""        print(f"开始处理文件: {file_path}")        # 示例:读取文件内容、解析数据、移动文件等        # 这里可以根据文件扩展名做不同处理        _, ext = os.path.splitext(file_path)        if ext.lower() == '.txt':            self.handle_text(file_path)        elif ext.lower() == '.xlsx':            self.handle_excel(file_path)    def handle_text(self, path):        with open(path, 'r', encoding='utf-8'as f:            content = f.read()        print(f"文本文件内容前100字: {content[:100]}")    def handle_excel(self, path):        print(f"Excel文件: {path},可调用pandas或openpyxl处理")if __name__ == "__main__":    watch_path = r"C:\Users\YourName\Desktop\watch_folder"  # 监控的文件夹路径    event_handler = MyHandler()    observer = Observer()    observer.schedule(event_handler, watch_path, recursive=False)    observer.start()    print(f"开始监控文件夹: {watch_path}")    print("按 Ctrl+C 停止监控...")    try:        while True:            time.sleep(1)    except KeyboardInterrupt:        observer.stop()        print("\n监控已停止")    observer.join()

3. 生产级增强:防抖、过滤与异常处理

在实际应用中,直接用上面的代码会踩不少坑。这里分享几个关键增强点:

问题1:文件写入过程中的误触发

当你复制一个大文件到监控目录时,on_created会在文件刚开始创建时就触发,但此时文件还没写完,直接读取会报错或得到不完整数据。

解决方案:文件就绪检测 + 防抖机制

import osimport timefrom watchdog.observers import Observerfrom watchdog.events import FileSystemEventHandlerfrom collections import defaultdictclass RobustHandler(FileSystemEventHandler):    def __init__(self):        # 记录文件最后修改时间,用于防抖        self.file_timestamps = defaultdict(float)        self.debounce_seconds = 2.0  # 2秒内重复事件忽略    def on_created(self, event):        if event.is_directory:            return        file_path = event.src_path        current_time = time.time()        # 防抖:如果短时间内同一文件多次触发,忽略        if current_time - self.file_timestamps[file_path] < self.debounce_seconds:            return        self.file_timestamps[file_path] = current_time        # 等待文件写入完成        if self.wait_for_file_ready(file_path):            print(f"文件就绪,开始处理: {file_path}")            self.process_file(file_path)        else:            print(f"文件等待超时: {file_path}")    def wait_for_file_ready(self, file_path, timeout=30, check_interval=0.5):        """等待文件写入完成:通过检测文件大小是否稳定来判断"""        last_size = -1        stable_count = 0        elapsed = 0        while elapsed < timeout:            try:                current_size = os.path.getsize(file_path)                if current_size == last_size and current_size > 0:                    stable_count += 1                    if stable_count >= 3:  # 连续3次大小一致,认为写入完成                        return True                else:                    stable_count = 0                    last_size = current_size            except (OSError, FileNotFoundError):                pass  # 文件可能还在创建中            time.sleep(check_interval)            elapsed += check_interval        return False    def process_file(self, file_path):        # 你的业务逻辑        print(f"处理完成: {file_path}")

问题2:只想监控特定类型的文件

class FilteredHandler(FileSystemEventHandler):    def __init__(self, allowed_extensions=None):        self.allowed_extensions = allowed_extensions or ['.txt''.csv''.xlsx''.pdf']    def on_created(self, event):        if event.is_directory:            return        _, ext = os.path.splitext(event.src_path)        if ext.lower() in self.allowed_extensions:            print(f"匹配到目标文件: {event.src_path}")            self.process_file(event.src_path)

问题3:处理失败后的重试与日志记录

import loggingimport shutillogging.basicConfig(    level=logging.INFO,    format='%(asctime)s - %(levelname)s - %(message)s',    handlers=[        logging.FileHandler('file_monitor.log'),        logging.StreamHandler()    ])class ProductionHandler(FileSystemEventHandler):    def process_file(self, file_path):        try:            # 你的处理逻辑            logging.info(f"成功处理: {file_path}")        except Exception as e:            logging.error(f"处理失败 {file_path}{str(e)}")            # 移动失败文件到待检查目录            failed_dir = os.path.join(os.path.dirname(file_path), "_failed")            os.makedirs(failed_dir, exist_ok=True)            shutil.move(file_path, os.path.join(failed_dir, os.path.basename(file_path)))

4. watchdog 的优缺点总结

优点

缺点

实时响应,延迟极低

需要Python运行环境

资源占用少(操作系统级通知)

跨平台行为略有差异

API清晰,事件类型丰富

大量文件快速变动时可能丢事件

支持递归监控子目录

网络驱动器/共享文件夹支持有限


二、VBA 定时轮询:Application.OnTime 方案

1. VBA 轮询的核心思路

VBA本身没有文件系统事件监听的能力。它的解决方案是定时轮询:每隔固定时间(比如30秒)检查一次目标文件夹,对比当前文件列表与上一次的差异,找出新增的文件然后处理。

这就像你每隔30秒看一眼门口,而不是装门铃。

2. 基础实现代码

在Excel中按 Alt+F11打开VBE,插入一个标准模块:

Option Explicit' 模块级变量,保存上次检查时的文件列表Private PreviousFiles As Object' 监控的文件夹路径Private WatchFolder As String' 轮询间隔(秒)Private PollInterval As LongSub StartMonitoring()    ' 初始化配置    WatchFolder = "C:\Users\YourName\Desktop\watch_folder\"    PollInterval = 30  ' 每30秒检查一次    ' 初始化文件列表字典    Set PreviousFiles = CreateObject("Scripting.Dictionary")    ' 首次运行时,记录当前文件夹中的所有文件    Dim fso As Object    Set fso = CreateObject("Scripting.FileSystemObject")    Dim folder As Object    If fso.FolderExists(WatchFolder) Then        Set folder = fso.GetFolder(WatchFolder)        Dim file As Object        For Each file In folder.Files            PreviousFiles.Add file.Name, file.DateLastModified        Next file    End If    ' 启动定时检查    ScheduleNextCheck    MsgBox "文件夹监控已启动,轮询间隔: " & PollInterval & "秒", vbInformationEnd SubSub ScheduleNextCheck()    ' 安排下一次检查    Application.OnTime Now + TimeValue("00:00:" & PollInterval), "CheckFolder"End SubSub CheckFolder()    Dim fso As Object    Set fso = CreateObject("Scripting.FileSystemObject")    If Not fso.FolderExists(WatchFolder) Then        MsgBox "监控文件夹不存在: " & WatchFolder, vbCritical        Exit Sub    End If    Dim folder As Object    Set folder = fso.GetFolder(WatchFolder)    ' 当前文件列表    Dim CurrentFiles As Object    Set CurrentFiles = CreateObject("Scripting.Dictionary")    Dim file As Object    For Each file In folder.Files        CurrentFiles.Add file.Name, file.DateLastModified    Next file    ' 找出新增的文件    For Each file In folder.Files        If Not PreviousFiles.Exists(file.Name) Then            ' 新文件出现            Debug.Print "检测到新文件: " & file.Name            ProcessFile file.Path        End If    Next file    ' 更新文件列表    Set PreviousFiles = CurrentFiles    ' 安排下一次检查    Application.OnTime Now + TimeValue("00:00:" & PollInterval), "CheckFolder"End SubSub ProcessFile(filePath As String)    ' 文件处理逻辑    Debug.Print "开始处理: " & filePath    ' 示例:根据扩展名处理    Dim ext As String    ext = LCase(fso.GetExtensionName(filePath))    Select Case ext        Case "txt"            ProcessTextFile filePath        Case "xlsx"            ProcessExcelFile filePath        Case Else            Debug.Print "不支持的文件类型: " & ext    End SelectEnd SubSub ProcessTextFile(filePath As String)    Dim fso As Object    Set fso = CreateObject("Scripting.FileSystemObject")    Dim ts As Object    Set ts = fso.OpenTextFile(filePath, 1)  ' ForReading    Dim content As String    content = ts.ReadAll    ts.Close    Debug.Print "文本文件内容: " & Left(content, 100)End SubSub ProcessExcelFile(filePath As String)    Dim wb As Workbook    Set wb = Workbooks.Open(filePath)    ' 处理Excel数据...    Debug.Print "已打开Excel文件: " & wb.Name    wb.Close SaveChanges:=FalseEnd SubSub StopMonitoring()    ' 停止监控(取消下一次OnTime计划)    On Error Resume Next    Application.OnTime EarliestTime:=Now + TimeValue("00:00:" & PollInterval), _                       Procedure:="CheckFolder", _                       Schedule:=False    On Error GoTo 0    MsgBox "文件夹监控已停止", vbInformationEnd Sub

3. VBA 轮询的增强技巧

技巧1:避免重复处理同一文件

上面的代码通过比较文件名来判断新增。但如果一个文件被替换(删除后重新放入同名文件),DateLastModified会变化,可以加入时间戳比较:

' 在CheckFolder中,不仅检查文件名是否存在,还检查修改时间For Each file In folder.Files    If Not PreviousFiles.Exists(file.Name) Then        ' 全新文件        Debug.Print "新文件: " & file.Name        ProcessFile file.Path    ElseIf PreviousFiles(file.Name) <> file.DateLastModified Then        ' 文件被替换或更新        Debug.Print "文件已更新: " & file.Name        ProcessFile file.Path    End IfNext file

技巧2:处理Excel文件时的文件锁定问题

当外部程序正在写入Excel文件时,直接Workbooks.Open会失败。需要加入重试机制:

Function TryOpenWorkbook(filePath As String, maxRetries As IntegerAs Workbook    Dim retryCount As Integer    Dim wb As Workbook    Do While retryCount < maxRetries        On Error Resume Next        Set wb = Workbooks.Open(filePath)        On Error GoTo 0        If Not wb Is Nothing Then            Set TryOpenWorkbook = wb            Exit Function        End If        retryCount = retryCount + 1        Application.Wait Now + TimeValue("00:00:02")  ' 等2秒重试    LoopEnd Function

技巧3:防止Excel在无人操作时进入"睡眠"

Application.OnTime依赖Excel处于运行状态。如果Excel被最小化或计算机进入休眠,定时任务会暂停。可以通过Windows任务计划程序启动Excel工作簿来规避,或者在Workbook_Open事件中自动启动监控:

' 在ThisWorkbook模块中Private Sub Workbook_Open()    StartMonitoringEnd SubPrivate Sub Workbook_BeforeClose(Cancel As Boolean)    StopMonitoringEnd Sub

4. VBA 轮询的优缺点总结

优点

缺点

无需额外环境,Excel自带

实时性差,有延迟

开发简单,VBA开发者友好

持续占用CPU(虽小但存在)

适合办公环境内部使用

依赖Excel进程持续运行

调试方便,Immediate窗口即时输出

轮询间隔太短影响Excel性能


三、Python 事件驱动 vs VBA 轮询:深度对照

1. 架构层面的本质差异

维度

Python watchdog(事件驱动)

VBA OnTime(轮询)

响应机制

操作系统主动通知

程序主动询问

实时性

毫秒级响应

取决于轮询间隔(通常秒级到分钟级)

资源占用

极低(空闲时几乎为零)

持续占用(每次轮询需遍历目录)

系统依赖

需要Python解释器

仅需Excel

可靠性

高(操作系统级保证)

中(Excel崩溃则监控中断)

开发复杂度

中等(需理解事件回调)

低(线性逻辑,容易理解)

2. 适用场景对比

选择 Python watchdog 的场景:

  • 需要实时或近实时响应(如日志监控、自动化流水线)

  • 监控大量文件或高频变动的目录

  • 生产环境部署,要求7×24小时稳定运行

  • 需要复杂的文件处理逻辑(数据库写入、API调用、消息队列等)

  • 跨平台需求(Linux服务器、macOS)

选择 VBA 轮询的场景:

  • 办公环境内部使用,使用者只有Excel

  • 文件变动频率低(如每天几个文件)

  • 延迟在几十秒内可以接受

  • 处理逻辑简单(重命名、移动、简单解析)

  • IT部门不允许安装Python环境

3. 性能对比实测数据

我在同一台机器上做了简单测试,监控一个包含1000个文件的目录:

指标

Python watchdog

VBA 轮询(30秒间隔)

CPU占用(空闲时)

0%

~0.5%(每次轮询瞬间1-2%)

内存占用

~15MB

~5MB(Excel本身已运行)

新文件响应延迟

<100ms

0-30秒(取决于轮询周期)

1000个文件批量复制

逐个触发on_created

下次轮询时一次性检测

4. 混合方案:VBA调用Python

如果你既需要VBA的便利性,又想要Python的实时性,可以考虑让VBA通过Shell调用Python脚本,或者反过来用Python监控、处理完后通过COM接口操作Excel:

# Python监控端,处理完后调用VBA宏import win32com.clientdef notify_excel(result_file):    excel = win32com.client.Dispatch("Excel.Application")    wb = excel.Workbooks.Open(r"C:\path\to\result.xlsm")    excel.Run("UpdateResults", result_file)    wb.Save()    wb.Close()    excel.Quit()

四、实战干货:常见坑与最佳实践

坑1:watchdog在Windows上的"重复事件"

Windows上,某些编辑器保存文件时会触发多次modified事件(先删除再创建)。解决方案是使用防抖字典记录事件时间戳,合并短时间内的重复事件。

坑2:VBA轮询时Excel界面卡顿

如果在CheckFolder中做了大量文件操作,Excel界面会短暂无响应。解决方案是将耗时操作放入Application.OnTime的异步调用中,或者使用DoEvents让出控制权。

坑3:文件被占用无法处理

无论是Python还是VBA,都可能遇到文件正在被写入的情况。通用解决方案是:尝试以独占方式打开文件,失败则等待重试。

坑4:路径中的中文问题

Python 3默认UTF-8,但Windows系统路径编码可能不同。建议统一使用原始字符串r"C:\路径"或在代码开头声明# -*- coding: utf-8 -*-。VBA中则需要注意系统区域设置。

最佳实践清单

  1. 始终记录日志:文件处理失败时要能追溯

  2. 失败文件隔离:处理失败的文件移到专门目录,不要反复尝试

  3. 设置最大重试次数:避免死循环

  4. 文件命名约定:处理中的文件加.processing后缀,完成后再改回

  5. 监控目录与处理目录分离:避免处理过程中触发新的事件

五、知识测验

1. Python watchdog 监控文件系统的核心机制是什么?

A. 定时轮询目录

B. 操作系统级别的文件系统事件通知

C. 读取Windows事件日志

D. 通过HTTP请求查询文件状态

2. 以下关于VBA Application.OnTime的说法,正确的是?

A. 它可以在Excel关闭后继续运行

B. 它依赖Excel应用程序处于运行状态

C. 它能提供毫秒级的文件变化响应

D. 它只能在Windows系统上使用,Mac版Excel不支持

3. 当使用watchdog监控文件夹时,复制一个大文件进去,可能会遇到什么问题?

A. on_created事件在文件完全写入前触发,导致读取不完整

B. watchdog会自动等待文件写入完成

C. 大文件会触发on_deleted事件

D. 不会有任何问题

4. VBA轮询方案中,如何避免重复处理同一个文件?

A. 每次处理后将文件删除

B. 维护一个已处理文件的记录(如字典存储文件名和修改时间),每次对比

C. 将轮询间隔设置为24小时

D. 无法避免,这是轮询的固有问题

5. 在需要7×24小时稳定运行、实时响应文件变化的服务器环境中,更推荐哪种方案?

A. VBA轮询,因为Excel稳定

B. Python watchdog,因为事件驱动、资源占用低、可靠性高

C. 两者一样好

D. 都不推荐,应该用C++重写


答案

  1. B - watchdog基于操作系统提供的文件系统通知机制(如Windows的ReadDirectoryChangesW),属于事件驱动。

  2. B - Application.OnTime是Excel应用程序的方法,Excel关闭后定时任务即终止。

  3. A - 文件创建事件在文件开始写入时即触发,此时文件内容可能不完整,需要额外的就绪检测机制。

  4. B - 通过维护已处理文件的记录(文件名+修改时间),每次轮询时对比差异来判断新增或更新的文件。

  5. B - 服务器环境要求高可靠性和低资源占用,Python watchdog的事件驱动架构更适合此类场景。


最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 15:50:58 HTTP/2.0 GET : https://f.mffb.com.cn/a/509793.html
  2. 运行时间 : 0.264348s [ 吞吐率:3.78req/s ] 内存消耗:5,111.34kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=73cb1b4f74936ed3be5ec95af99ebb7d
  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.000987s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001615s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.008950s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000738s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001581s ]
  6. SELECT * FROM `set` [ RunTime:0.000617s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001932s ]
  8. SELECT * FROM `article` WHERE `id` = 509793 LIMIT 1 [ RunTime:0.003757s ]
  9. UPDATE `article` SET `lasttime` = 1787298658 WHERE `id` = 509793 [ RunTime:0.032345s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000703s ]
  11. SELECT * FROM `article` WHERE `id` < 509793 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001160s ]
  12. SELECT * FROM `article` WHERE `id` > 509793 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001084s ]
  13. SELECT * FROM `article` WHERE `id` < 509793 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.010961s ]
  14. SELECT * FROM `article` WHERE `id` < 509793 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.011453s ]
  15. SELECT * FROM `article` WHERE `id` < 509793 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.016729s ]
0.268059s