当前位置:首页>python>Python ctypes回调全解析:硬件与系统API交互实战指南

Python ctypes回调全解析:硬件与系统API交互实战指南

  • 2026-06-28 20:46:42
Python ctypes回调全解析:硬件与系统API交互实战指南

在Python中与硬件或操作系统API交互时,回调函数(Callback Function)是一个常见且重要的概念。回调函数允许我们将Python函数作为参数传递给C/C++编写的API,当特定事件发生或条件满足时,API会调用我们提供的函数。ctypes模块为Python提供了与C兼容的回调机制,使得这种交互成为可能。

回调函数基础

回调函数的概念

回调函数是一种通过函数指针实现的机制,允许一个函数在特定事件发生时调用另一个函数。在C/C++中,函数指针是一种变量,存储了函数的地址,可以通过该指针调用函数。在Python中,ctypes通过CFUNCTYPEWINFUNCTYPE(Windows平台)提供了类似的功能。

为什么需要回调

在与硬件或操作系统API交互时,回调函数常用于以下场景:

  1. 1. 异步事件处理:如硬件中断、窗口消息、网络数据到达等。
  2. 2. 迭代器模式:API需要逐个处理一组数据,通过回调函数通知调用方。
  3. 3. 自定义行为:允许调用方在API的特定点插入自定义逻辑。

使用ctypes定义回调函数

选择正确的函数类型

在ctypes中,定义回调函数需要使用CFUNCTYPEWINFUNCTYPE

  • • CFUNCTYPE:用于遵循cdecl调用约定的函数(Linux/macOS常见)。
  • • WINFUNCTYPE:用于遵循stdcall调用约定的函数(Windows常见)。

基本语法

from ctypes import *# 定义回调函数类型CALLBACK_TYPE = CFUNCTYPE(RETURN_TYPE, ARG1_TYPE, ARG2_TYPE, ...)# 定义实际的回调函数defcallback_func(arg1, arg2, ...):# 处理逻辑return return_value# 将Python函数转换为C回调callback_ptr = CALLBACK_TYPE(callback_func)

类型安全

为确保类型安全,应明确指定回调函数的返回类型和参数类型。ctypes不会自动进行类型检查,错误的类型可能导致程序崩溃。

Windows API回调案例:枚举窗口

场景描述

Windows提供了EnumWindows函数,用于枚举所有顶级窗口。它需要一个回调函数,该函数对每个找到的窗口都会被调用一次。

C原型

BOOL EnumWindows(  WNDENUMPROC lpEnumFunc,  // 回调函数  LPARAM      lParam       // 用户定义数据);typedefBOOL(CALLBACK *WNDENUMPROC)(HWND, LPARAM);

Python实现

import ctypesfrom ctypes.wintypes import *# 加载user32.dlluser32 = ctypes.WinDLL('user32', use_last_error=True)# 定义回调函数类型WNDENUMPROC = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM)# 定义回调函数defenum_windows_callback(hwnd, lparam):# 获取窗口标题    length = user32.GetWindowTextLengthW(hwnd) + 1    buf = ctypes.create_unicode_buffer(length)    user32.GetWindowTextW(hwnd, buf, length)# 打印窗口标题和句柄print(f"Window: {buf.value}, HWND: {hwnd}")# 继续枚举(返回True)# 如果返回False,枚举将停止returnTrue# 将Python函数转换为C回调callback_ptr = WNDENUMPROC(enum_windows_callback)# 调用EnumWindowsuser32.EnumWindows(callback_ptr, 0)

代码解释

  1. 1. 加载库:加载user32.dll,它包含EnumWindows函数。
  2. 2. 定义回调类型:使用WINFUNCTYPE定义与C兼容的回调函数类型。
  3. 3. 实现回调函数enum_windows_callback函数接收窗口句柄和用户数据,获取窗口标题并打印。
  4. 4. 转换回调:将Python函数转换为C回调指针。
  5. 5. 调用API:传递回调指针和用户数据(这里为0)给EnumWindows

Linux系统回调案例:目录遍历

场景描述

在Linux中,ftw(file tree walk)函数用于遍历目录树。它需要一个回调函数,对每个文件或目录都会被调用。

C原型

#include<ftw.h>intnftw(constchar *dirpath,int (*fn) (constchar *fpath, conststruct stat *sb, int typeflag, struct FTW *ftwbuf),int nopenfd,int flags);

Python实现

import ctypesimport osfrom ctypes.util import find_library# 加载libclibc = ctypes.CDLL(find_library('c'), use_errno=True)# 定义stat结构体(简化版)classStat(ctypes.Structure):    _fields_ = [        ('st_mode', ctypes.c_uint),# 其他字段省略...    ]# 定义FTW结构体(简化版)classFTW(ctypes.Structure):    _fields_ = [        ('base', ctypes.c_int),        ('level', ctypes.c_int),    ]# 定义回调函数类型FTW_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_int,                                 ctypes.c_char_p,                                 ctypes.POINTER(Stat),                                 ctypes.c_int,                                 ctypes.POINTER(FTW))# 定义回调函数defftw_callback(fpath, sb, typeflag, ftwbuf):# 将字节字符串转换为Python字符串    path = fpath.decode('utf-8')# 根据typeflag判断文件类型if typeflag == 0:  # FTW_F (file)print(f"File: {path}")elif typeflag == 1:  # FTW_D (directory)print(f"Directory: {path}")elif typeflag == 2:  # FTW_DNR (unreadable directory)print(f"Unreadable directory: {path}")# 其他类型flag省略...# 返回0表示继续遍历return0# 将Python函数转换为C回调callback_ptr = FTW_CALLBACK(ftw_callback)# 定义nftw函数原型libc.nftw.argtypes = [ctypes.c_char_p, FTW_CALLBACK, ctypes.c_int, ctypes.c_int]libc.nftw.restype = ctypes.c_int# 调用nftw遍历当前目录result = libc.nftw(b'.', callback_ptr, 100)if result != 0:print(f"nftw failed with error code: {result}")

代码解释

  1. 1. 加载库:加载libc,它包含nftw函数。
  2. 2. 定义结构体:定义与C兼容的StatFTW结构体。
  3. 3. 定义回调类型:使用CFUNCTYPE定义回调函数类型。
  4. 4. 实现回调函数ftw_callback函数处理每个文件或目录,打印相关信息。
  5. 5. 转换回调:将Python函数转换为C回调指针。
  6. 6. 设置函数原型:明确nftw的参数和返回类型。
  7. 7. 调用API:传递当前目录、回调指针等参数给nftw

硬件交互回调案例:USB设备插入检测

场景描述

在Windows中,可以使用SetupAPI来检测USB设备的插入和移除。这需要注册设备通知回调。

简化实现

import ctypesfrom ctypes.wintypes import *# 加载必要的DLLuser32 = ctypes.WinDLL('user32', use_last_error=True)setupapi = ctypes.WinDLL('setupapi', use_last_error=True)# 定义常量DBT_DEVICEARRIVAL = 0x8000DBT_DEVICEREMOVECOMPLETE = 0x8004DBT_DEVTYP_DEVICEINTERFACE = 0x00000005# 定义DEV_BROADCAST_HDR结构体classDEV_BROADCAST_HDR(ctypes.Structure):    _fields_ = [        ('dbch_size', DWORD),        ('dbch_devicetype', DWORD),        ('dbch_reserved', DWORD),    ]# 定义DEV_BROADCAST_DEVICEINTERFACE结构体classDEV_BROADCAST_DEVICEINTERFACE(DEV_BROADCAST_HDR):    _fields_ = [        ('dbcc_classguid', GUID),        ('dbcc_name', ctypes.c_char * 256),    ]# 定义窗口过程类型(用于接收消息)WNDPROC = ctypes.WINFUNCTYPE(c_long, HWND, UINT, WPARAM, LPARAM)# 定义消息处理回调defwindow_proc(hwnd, msg, wparam, lparam):if msg == 0x0219:  # WM_DEVICECHANGE        dev_broadcast = ctypes.cast(lparam, ctypes.POINTER(DEV_BROADCAST_HDR)).contentsif dev_broadcast.dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE:if wparam == DBT_DEVICEARRIVAL:print("USB device inserted")elif wparam == DBT_DEVICEREMOVECOMPLETE:print("USB device removed")return0# 创建消息窗口(简化版,实际需要完整窗口创建流程)# 这里仅演示回调机制,实际需要更完整的实现classMessageWindow:def__init__(self):self.wnd_proc = WNDPROC(window_proc)# 实际实现需要注册窗口类、创建窗口等# 这里省略这些步骤# 主函数defmain():# 创建消息窗口(简化)    window = MessageWindow()# 在实际应用中,这里需要进入消息循环# while True:#     msg = MSG()#     if GetMessage(...):#         TranslateMessage(...)#         DispatchMessage(...)print("Listening for USB device events... (Press Ctrl+C to exit)")import timetry:whileTrue:            time.sleep(1)except KeyboardInterrupt:passif __name__ == "__main__":    main()

完整实现要点

在实际应用中,完整的USB设备检测需要:

  1. 1. 注册窗口类:定义窗口过程,处理WM_DEVICECHANGE消息。
  2. 2. 创建隐藏窗口:用于接收设备通知消息。
  3. 3. 注册设备通知:使用RegisterDeviceNotification API。
  4. 4. 消息循环:持续处理系统消息。

回调函数的最佳实践

  1. 1. 保持回调简洁:回调函数应尽可能简单,避免复杂逻辑。
  2. 2. 错误处理:在回调中添加适当的错误处理,防止程序崩溃。
  3. 3. 线程安全:如果回调可能在多线程环境中被调用,确保线程安全。
  4. 4. 资源管理:注意回调中使用的资源,避免内存泄漏。
  5. 5. 性能考虑:频繁调用的回调应尽量高效。

常见问题与解决方案

问题1:回调函数不被调用

可能原因

  • • 回调类型定义不正确
  • • 回调指针未正确传递
  • • API调用条件未满足

解决方案

  • • 检查回调类型定义是否与C原型匹配
  • • 确保回调指针正确创建和传递
  • • 验证API调用条件和参数

问题2:程序在回调中崩溃

可能原因

  • • 类型不匹配导致访问违规
  • • 回调中抛出未捕获的异常
  • • 访问已释放的资源

解决方案

  • • 确保所有类型正确匹配
  • • 在回调中添加异常处理
  • • 检查资源生命周期管理

问题3:回调性能问题

可能原因

  • • 回调中执行耗时操作
  • • 回调被过于频繁调用

解决方案

  • • 优化回调逻辑,减少耗时操作
  • • 如果可能,批量处理数据而不是逐个处理

高级主题:传递用户数据给回调

许多API允许传递一个lParam或类似的用户数据参数给回调函数。这可以用于:

  1. 1. 传递上下文信息:如Python对象、状态等。
  2. 2. 区分多个回调实例:当注册多个回调时。

示例:改进的窗口枚举

# 定义回调函数,接收用户数据defenum_windows_callback_with_data(hwnd, lparam):# lparam可以是一个包含额外数据的对象    prefix = lparam['prefix']    length = user32.GetWindowTextLengthW(hwnd) + 1    buf = ctypes.create_unicode_buffer(length)    user32.GetWindowTextW(hwnd, buf, length)if buf.value.startswith(prefix):print(f"Matching window: {buf.value}")returnTrue# 创建用户数据字典user_data = {'prefix''Notepad'}# 注意:需要将Python对象转换为C可理解的形式# 这里简化处理,实际可能需要使用ctypes结构体或整数ID# 更实际的做法是使用整数ID和全局字典window_data = {}data_id = id(user_data)window_data[data_id] = user_data# 修改回调函数defenum_windows_callback_real(hwnd, data_id):    user_data = window_data.get(data_id)ifnot user_data:returnFalse    prefix = user_data['prefix']# 其余逻辑相同...# 更优雅的解决方案是使用ctypes结构体classUserData(ctypes.Structure):    _fields_ = [        ('prefix', ctypes.c_wchar * 100),    ]# 然后传递指向UserData的指针作为lparam

ctypes为Python提供了强大的机制来处理与硬件或操作系统API交互中的回调场景。通过正确使用CFUNCTYPEWINFUNCTYPE,我们可以定义与C兼容的回调函数,并将其传递给各种API。

关键点包括:

  1. 1. 选择正确的函数类型(CFUNCTYPEWINFUNCTYPE
  2. 2. 确保类型安全,明确定义返回类型和参数类型
  3. 3. 处理回调中的错误和资源管理
  4. 4. 考虑如何传递用户数据给回调函数

通过本文提供的案例和最佳实践,读者应该能够自信地在自己的Python项目中实现与硬件或操作系统API的回调交互。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 19:15:57 HTTP/2.0 GET : https://f.mffb.com.cn/a/487334.html
  2. 运行时间 : 0.103840s [ 吞吐率:9.63req/s ] 内存消耗:4,798.23kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9a20986f805c7c8cf819d7e6fbbafda9
  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.000472s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000742s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000309s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.009948s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000716s ]
  6. SELECT * FROM `set` [ RunTime:0.000260s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000641s ]
  8. SELECT * FROM `article` WHERE `id` = 487334 LIMIT 1 [ RunTime:0.000527s ]
  9. UPDATE `article` SET `lasttime` = 1783077357 WHERE `id` = 487334 [ RunTime:0.017500s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000246s ]
  11. SELECT * FROM `article` WHERE `id` < 487334 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000420s ]
  12. SELECT * FROM `article` WHERE `id` > 487334 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000522s ]
  13. SELECT * FROM `article` WHERE `id` < 487334 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001795s ]
  14. SELECT * FROM `article` WHERE `id` < 487334 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001255s ]
  15. SELECT * FROM `article` WHERE `id` < 487334 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001134s ]
0.105419s