当前位置:首页>python>我被Python装饰器坑了三个月,直到搞懂它的"套路"

我被Python装饰器坑了三个月,直到搞懂它的"套路"

  • 2026-06-29 12:51:56
我被Python装饰器坑了三个月,直到搞懂它的"套路"

先说个真实故事。

去年我接了一个接口日志项目,需要记录每个API的调用时间、请求参数和返回状态。团队里有个"老司机"说用装饰器简单,写个@log就搞定了。我照着文档抄了一遍,运行——直接报错:TypeError: wrapper() missing 1 required positional argument

我对着屏幕发了半小时呆。文档明明就是这样写的啊?哪里出问题了?

后来排查半天才发现,问题出在我抄的博客太老了,用的是Python 2的写法。到了Python 3,连个像样的报错提示都不给,就扔给你一句"缺少参数"。那个项目差点因此延期。

那次经历让我下定决心把装饰器彻底搞清楚——不是半懂不懂地照抄,而是从原理到实战全部拿下。

今天把我踩过的坑、总结的经验、提炼的套路一次性讲清楚。不堆概念,不念教材,直接上你在代码里会遇到的问题。


装饰器到底是什么?

网上说"装饰器是一种闭包",对,但看完你还是不会写。

换个理解方式。装饰器就是一个函数的"包装膜"。

你去水果店买水果,水果本身没变,但套上包装盒之后:可以保鲜,可以印logo,可以加个防伪标签。装饰器干的就是这个事——在不改原函数代码的前提下,给函数加点额外的功能

最常见的场景:计时、登录校验、日志记录、性能监控。这些需求如果每个函数都手写一遍,代码会变得又臭又长。装饰器让你只写一次,到处贴标签。

import timedef timer(func):    def wrapper(*args, **kwargs):        start = time.time()        result = func(*args, **kwargs)        end = time.time()        print(f"函数 {func.__name__} 耗时 {end - start:.4f} 秒")        return result    return wrapper@timerdef slow_function():    time.sleep(1)    return "Done"slow_function()

slow_function 本身没有任何改动,贴上@timer之后,自动拥有了计时能力。这就是装饰器的核心价值——增强函数,但不污染函数本身


它为什么能工作?

很多人会用装饰器,但不知道为什么能这样用。看懂下面这段,你就能自己创造装饰器了:

def slow_function():    return "Done"def timer(func):    def wrapper():        start = time.time()        result = func()        end = time.time()        print(f"耗时 {end - start:.4f} 秒")        return result    return wrapperslow_function = timer(slow_function)  # 这一行就是 @timer 的本质

装饰器的语法糖@timer就是上面那行手动包装的简写。

所以装饰器的本质就是:一个高阶函数,输入是函数,输出还是函数。


踩坑实录:那些让新手崩溃的瞬间

坑一:*args, **kwargs 写错一个符号

def my_decorator(func):    def wrapper(*args, **kwargs):  # 星号必须带        print("开始执行")        return func(*args, **kwargs)  # 这里也是    return wrapper

*args写成args,或者把**kwargs写成kwargs,Python会报一个很隐晦的错误。是解包操作,func(*args)是把元组里的每个元素拆开传给函数。写func(args)是把整个元组当一个参数传进去,函数签名就对不上了。

自检方法:把装饰器在复杂签名的函数上先测一遍:

@my_decoratordef complex_func(a, b=10, *args, **kwargs):    print(f"a={a}, b={b}, args={args}, kwargs={kwargs}")complex_func(1, 2, 3, 4, name="test")

坑二:装饰器带参数,写成了套娃

def log(level="INFO"):    def decorator(func):        def wrapper(*args, **kwargs):            print(f"[{level}] 调用 {func.__name__}")            return func(*args, **kwargs)        return wrapper    return decorator@log("ERROR")def run():    pass

记忆法:装饰器带参数,就是"工厂的工厂"。

拆解三层各自负责什么:

  • 第一层log("ERROR")负责接收参数,返回一个装饰器
  • 第二层decorator负责接收被装饰的函数,返回包装函数
  • 第三层wrapper才是真正包裹原函数的逻辑

@log("ERROR")等价于run = log("ERROR")(run)

坑三:装饰器改变了原函数的"身份"

@timerdef add(a, b):    """两数相加,返回结果"""    return a + bprint(add.__name__)   # 输出什么?wrapper  ← 函数名丢了print(add.__doc__)    # 输出什么?None    ← 文档丢了

很多框架会根据函数名和文档字符串来生成路由或校验规则。元数据丢了,轻则路由名变成wrapper,重则整个应用行为异常。

解法只有一行:

import functoolsdef timer(func):    @functools.wraps(func)  # 把原函数的元数据复制过来    def wrapper(*args, **kwargs):        start = time.time()        result = func(*args, **kwargs)        end = time.time()        print(f"耗时 {end - start:.4f} 秒")        return result    return wrapper

加上@functools.wraps(func)这一行,原函数的__name____doc____annotations__全部保留。这行代码没有理由不写,养成习惯。

坑四:装饰器返回了None

def bad_decorator(func):    def wrapper(*args, **kwargs):        print("做一些操作")        func(*args, **kwargs)  # 没有return!    return wrapper@bad_decoratordef get_data():    return [1, 2, 3]result = get_data()print(result)  # 输出:None ← 返回值丢了

记住:装饰器的wrapper永远要return原函数的执行结果。


实战:写一个带缓存的装饰器

import functools, timedef memoize(ttl=300):    """    带过期时间的内存缓存装饰器    ttl: 缓存有效期(秒),默认5分钟    """    cache = {}    def decorator(func):        @functools.wraps(func)        def wrapper(*args, **kwargs):            key = str(args) + str(sorted(kwargs.items()))            now = time.time()            if key in cache:                val, t, expire = cache[key]                if now - t < expire:                    print(f"命中缓存 (剩余 {expire - (now - t):.0f}s)")                    return val            result = func(*args, **kwargs)            cache[key] = (result, now, ttl)            print("缓存未命中,执行函数")            return result        return wrapper    return decorator@memoize(ttl=10)def fetch_api(user_id, include_history=True):    time.sleep(2)  # 假设每次请求耗时2秒    return {"user_id": user_id, "data": [1, 2, 3]}data1 = fetch_api(1001)  # 耗时2秒data2 = fetch_api(1001)  # 0秒返回,命中缓存data3 = fetch_api(1002)  # 耗时2秒,不同参数

同样参数10秒内重复调用,2秒请求变成0秒。配合Redis,可以做成分布式缓存。


类装饰器:不是函数也可以被装饰

单例模式装饰器

def singleton(cls):    instances = {}    @functools.wraps(cls)    def get_instance(*args, **kwargs):        if cls not in instances:            instances[cls] = cls(*args, **kwargs)        return instances[cls]    return get_instance@singletonclass DatabaseConnection:    def __init__(self):        print("创建数据库连接...")        self.connected = Truedb1 = DatabaseConnection()db2 = DatabaseConnection()db3 = DatabaseConnection()print(db1 is db2 is db3)  # True,只初始化一次

调用三次DatabaseConnection(),但__init__只执行了一次。适合场景:数据库连接池、配置管理器、线程池、日志实例。

路由注册装饰器

class Router:    routes = {}    @classmethod    def route(cls, path):        def decorator(func):            cls.routes[path] = func            print(f"注册路由: {path} -> {func.__name__}")            return func        return decoratorclass MyApp(Router):    @Router.route("/home")    def home(self): return "Welcome home"    @Router.route("/about")    def about(self): return "About us"print(MyApp.routes)

多个装饰器的叠加顺序

@log_decorator@timer_decoratordef process():    time.sleep(0.1)    return "Done"

从下往上依次执行。 可以想象从里到外穿衣服:先穿内衣@timer_decorator,再套外套@log_decorator

反过来看调用:process()先经过外套log_decorator,再进入内衣timer_decorator,最后到达process本体。这就是为什么内层装饰器加@functools.wraps那么重要——它确保log_decorator看到的是真实的函数名。


真实项目的两个实用场景

场景一:重试机制

import functools, time, logginglogger = logging.getLogger(__name__)def retry(max_attempts=3, delay=1):    def decorator(func):        @functools.wraps(func)        def wrapper(*args, **kwargs):            for attempt in range(max_attempts):                try:                    return func(*args, **kwargs)                except Exception as e:                    if attempt == max_attempts - 1:                        raise                    logger.warning(f"第{attempt+1}次失败,{delay}s后重试: {e}")                    time.sleep(delay)        return wrapper    return decorator@retry(max_attempts=3, delay=2)def call_api(url):    import random    if random.random() < 0.7:        raise ConnectionError("网络超时")    return "成功"

场景二:权限校验

def requires_auth(permission):    def decorator(func):        @functools.wraps(func)        def wrapper(*args, **kwargs):            user = get_current_user()            if permission not in user.permissions:                raise PermissionError(f"需要权限: {permission}")            return func(*args, **kwargs)        return wrapper    return decorator@requires_auth("admin")def delete_user(user_id): pass@requires_auth("finance")def export_report(): pass

权限逻辑和业务逻辑完全分离,改一处不影响另一处。


行动框架

第一步,理解闭包的原理。 装饰器背后就是闭包——函数可以记住定义时的变量。理解了闭包,装饰器就是顺水推舟。

第二步,动手写。 从@timer开始,重点跑通@functools.wraps这一步。然后试带参数的装饰器,再试类装饰器。

第三步,读优质源码。 Flask的@app.route、Django的@login_required、FastAPI的路径装饰器——都是非常高质量的参考。

第四步,警惕过度封装。 同一个逻辑需要在多处使用时,才值得抽取成装饰器。只在某个函数里加一行日志,手动写就行。


别再把装饰器当成高深莫测的高级语法来回避了。它的本质就是一个函数包裹函数的技巧,搞清楚三件事就够了:谁包裹谁、参数怎么传递、元数据怎么保留。

下次再遇到@开头的代码,别跳过。花五分钟读一下,看看它给函数包了什么功能。你会发现,看懂别人的装饰器,比你想象的要简单得多。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 16:37:54 HTTP/2.0 GET : https://f.mffb.com.cn/a/486955.html
  2. 运行时间 : 0.172847s [ 吞吐率:5.79req/s ] 内存消耗:4,981.52kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=b64d522990390f0a0e77eff74749f785
  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.000405s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000545s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000246s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000277s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000494s ]
  6. SELECT * FROM `set` [ RunTime:0.006593s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000639s ]
  8. SELECT * FROM `article` WHERE `id` = 486955 LIMIT 1 [ RunTime:0.002408s ]
  9. UPDATE `article` SET `lasttime` = 1783067874 WHERE `id` = 486955 [ RunTime:0.005375s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.001493s ]
  11. SELECT * FROM `article` WHERE `id` < 486955 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000450s ]
  12. SELECT * FROM `article` WHERE `id` > 486955 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.012180s ]
  13. SELECT * FROM `article` WHERE `id` < 486955 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001301s ]
  14. SELECT * FROM `article` WHERE `id` < 486955 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.012943s ]
  15. SELECT * FROM `article` WHERE `id` < 486955 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.061843s ]
0.174460s