当前位置:首页>python>Python 并发与 asyncio 9.4 Django 的异步视图

Python 并发与 asyncio 9.4 Django 的异步视图

  • 2026-02-03 18:59:05
Python 并发与 asyncio 9.4 Django 的异步视图

9.4 Django 的异步视图

作为最流行、使用最广泛的 Python 框架之一,Django 出厂即带着一堆实用功能:强悍的 对象关系映射器(ORM)帮你操控数据库,自带的可定制后台管理系统让你效率飞升。

过去,直到版本 3.0 以前,Django 仅支持以 WSGI 方式部署,几乎不支持异步。主要依靠第三方的 channels 库来满足部分需求。但从 3.0 版本开始,它正式引入了对 ASGI 支持,开启了向全异步演进的大门。到了 3.1 版本,更是实现了异步视图,让开发者能直接在视图中使用 asyncio 语言。

当然,这还处于早期阶段。比如,它的数据库引擎仍保持同步(但未来的计划是支持异步),整体能力还在不断完善。不过别担心,随着 Django 不断进化,这块短板会逐渐补齐。

我们来实战一下:用 Django 构建一个视图,去调用 aiohttp 进行并发请求。设想你正在集成一个外部 API,需要跑一批并发请求,查看每个请求的响应时间、返回体长度,还有失败次数。我们希望做一个页面,接收一个目标网址和请求数,然后并发发起请求,最后把结果以表格形式返回。

先确认你的 Django 版本:

pip install -Iv django==3.2.8

创建项目:

django-admin startproject async_views

生成文件夹结构:

async_views/    manage.py    async_views/        __init__.py        settings.py        urls.py        asgi.py        wsgi.py

注意:既有 wsgi.py 又有 asgi.py,这说明它既能在 WSGI 下运行,也能在 ASGI 下运行,超灵活!

现在可以用 Uvicorn 试试默认的 Django 欢迎页:

gunicorn async_views.asgi:application -k uvicorn.workers.UvicornWorker

打开 http://localhost:8000,你应该就能看到经典的 Django 欢迎页。

接着,我们来创建一个叫 async_api 的应用:

python manage.py startapp async_api

现在,万事俱备。我们来写一个异步视图。

列表 9.11 一个 Django 异步视图
import asynciofrom datetime import datetimefrom aiohttp import ClientSessionfrom django.shortcuts import renderimport aiohttpasync def get_url_details(session: ClientSession, url: str):    start_time = datetime.now()    response = await session.get(url)    response_body = await response.text()    end_time = datetime.now()    return {'status': response.status,            'time': (end_time - start_time).microseconds,            'body_length': len(response_body)}async def make_requests(url: str, request_num: int):    async with aiohttp.ClientSession() as session:        requests = [get_url_details(session, url) for _ in range(request_num)]        results = await asyncio.gather(*requests, return_exceptions=True)        failed_results = [str(result) for result in results if isinstance(result, Exception)]        successful_results = [result for result in results if not isinstance(result, Exception)]        return {'failed_results': failed_results, 'successful_results': successful_results}async def requests_view(request):    url: str = request.GET['url']    request_num: int = int(request.GET['request_num'])    context = await make_requests(url, request_num)    return render(request, 'async_api/requests.html', context)

这个视图做了两件事:第一,封装了 get_url_details 协程,发送请求并收集状态、时间和响应体长度。第二,定义了一个 requests_view 异步视图,它从查询参数中拿到 urlrequest_num,用 gather 并发执行所有请求,把成功和失败的结果分类,最后交给 render 渲染成页面。

但是我们还没建模板!现在先把视图模板建好。

先创建目录结构:

async_api/    templates/        async_api/            requests.html

然后写 templates/async_api/requests.html

列表 9.12 requests 视图模板
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Request Summary</title></head><body><h1>Summary of requests:</h1><h2>Failures:</h2><table>    {% for failure in failed_results %}    <tr>        <td>{{failure}}</td>    </tr>    {% endfor %}</table><h2>Successful Results:</h2><table>    <tr>        <td>Status code</td>        <td>Response time (microseconds)</td>        <td>Response size</td>    </tr>    {% for result in successful_results %}    <tr>        <td>{{result.status}}</td>        <td>{{result.time}}</td>        <td>{{result.body_length}}</td>    </tr>    {% endfor %}</table></body></html>

这个页面会列出所有异常和成功结果,虽然看着不太美,但信息绝对全。

接下来,我们要把视图和模板链接起来,让它能被访问。在 async_api 目录下新建 urls.py

列表 9.13 async_api/urls.py
from django.urls import pathfrom . import viewsapp_name = 'async_api'urlpatterns = [    path('', views.requests_view, name='requests'),]

然后修改项目主 urls.py,让它能路由到这个应用:

from django.contrib import adminfrom django.urls import path, includeurlpatterns = [    path('admin/', admin.site.urls),    path('requests/', include('async_api.urls'))]

最后,把 async_api 加入 INSTALLED_APPS

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'async_api']

准备完毕!启动应用:

gunicorn async_views.asgi:application -k uvicorn.workers.UvicornWorker

现在,打开这个页面:

http://localhost:8000/requests/?url=http://example.com&request_num=10

你将会看到一张漂亮的报表,如图 9.3 所示。

图 9.3:requests 异步视图

我们成功用 ASGI 部署了一个能并发发送大量请求的 Django 视图。

但问题是:如果项目不能用或不允许使用 ASGI,怎么办?比如你正在维护一个旧系统。好消息是,哪怕用 WSGI 运行,这个异步视图也依然可以工作!

尝试用 gunicornwsgi.py 运行:

gunicorn async_views.wsgi:application

你依然能访问这个接口。它为啥能“活”下来?

秘密就在于:在 WSGI 模式下,每次请求都会创建一个新的事件循环。你可以在视图里加一行代码来验证:

loop = asyncio.get_running_loop()print(id(loop))

你很快会发现,每次访问这个页面,id(loop) 输出的数字都不一样,说明每次请求都新建了一个事件循环。这恰好解决了阻塞的问题。

反观在 ASGI 模式下,id(loop) 每次都相同,因为整个应用只用一个全局的事件循环。

这告诉我们:即使不部署在 ASGI 上,也能利用异步的优势。但,如果某些逻辑需要跨请求维持一个长时间运行的事件循环,那就必须启用 ASGI。

9.4.1 在异步视图中运行阻塞代码

那如果视图里要用到传统的、同步的库呢?比如那些没有 await 支持的老旧代码,这可是“大忌”啊!好在 ASGI 有一招杀手锏sync_to_async 函数。

在第 7 章,我们学过,可以把同步的代码扔进线程池执行,让它变成 awaitablesync_to_async 就是做这个的“一键包装器”,但有个重要的细节:它默认是“线程敏感”(thread-sensitive)的

很多同步库不是设计为多线程安全的,如果从多个线程调用,可能会引发竞态条件。为防万一,sync_to_async 默认会让代码在 Django 主线程里执行。这就意味着:任何你放进去的阻塞操作,都会阻塞整个 Django 应用进程——哪怕你想享受异步带来的好处,也得付出代价。

但如果你确定自己的代码是线程安全的(比如没有共享状态,或者共享状态不依赖特定线程),就可以将 thread_sensitive=False,它就会为每次调用创建一个新线程,避免阻塞主线程。

我们用个例子演示:

列表 9.14 sync_to_async 视图
from functools import partialfrom django.http import HttpResponsefrom asgiref.sync import sync_to_asyncdef sleep(seconds: int):    import time    time.sleep(seconds)async def sync_to_async_view(request):    sleep_time: int = int(request.GET['sleep_time'])    num_calls: int = int(request.GET['num_calls'])    thread_sensitive: bool = request.GET['thread_sensitive'] == 'True'    function = sync_to_async(partial(sleep, sleep_time), thread_sensitive=thread_sensitive)    await asyncio.gather(*[function() for _ in range(num_calls)])    return HttpResponse('')

然后在路由里加:

path('sync_to_async', views.sync_to_async_view)

现在用这个链接测试:

http://127.0.0.1:8000/requests/sync_to_async?sleep_time=5&num_calls=5&thread_sensitive=False

你会发现,总共只花了 5 秒 就完成(因为是并行运行),而且多次访问互不影响。现在把 thread_sensitive 设为 True,再来跑一遍:

  • 这次得花 25 秒,因为它要串行地运行五个 5 秒的睡眠。
  • 而且多次访问时,后一个请求必须等前一个完全结束才能开始,因为是阻塞了主线程。

所以,sync_to_async 是个利器,但也得讲究用法。你需要评估代码是否线程安全,也要权衡它对异步性能的影响。

9.4.2 在同步视图中调用异步代码

顺理成章的问题来了:“我有个同步的视图,但我想用 asyncio 库,该咋办?” 这时,ASGI 提供了另一件神兵利器:async_to_sync

这个函数的作用是:把一个协程封装成一个同步函数,在需要的地方运行,返回结果。如果没运行事件循环(比如在 WSGI 下),它会自动创建一个;否则就在当前循环中执行。完美衔接!

我们试试把之前的 requests_view 改成同步视图,却依然用异步函数:

列表 9.15 在同步视图中调用异步代码
from asgiref.sync import async_to_syncdef requests_view_sync(request):    url: str = request.GET['url']    request_num: int = int(request.GET['request_num'])    context = async_to_sync(partial(make_requests, url, request_num))()    return render(request, 'async_api/requests.html', context)

然后添加路由:

path('async_to_sync', views.requests_view_sync)

访问:

http://localhost:8000/requests/async_to_sync?url=http://example.com&request_num=10

结果一模一样!

结论:就算在传统的同步(如 WSGI)环境下,只要善用 sync_to_async,你也能享受到一些异步架构带来的性能优势,而不必一步到位全部改造成异步。

总结

  • 我们学会了如何使用 aiohttp + asyncpg 构建连接数据库的基本的、强大的、可扩展的 RESTful API。
  • 学会了如何用 Starlette 构建完全兼容 ASGI 的现代化应用。
  • 学会了如何使用 Starlette 和 WebSocket,让你的前端能实时更新数据,彻底告别反复轮询的无聊重复劳动。
  • 学会了如何在 Django 中使用异步视图,以及如何在同步视图中调用异步代码,反向亦然,真正做到了融会贯通。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 23:42:08 HTTP/2.0 GET : https://f.mffb.com.cn/a/468406.html
  2. 运行时间 : 0.191283s [ 吞吐率:5.23req/s ] 内存消耗:4,827.11kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=caf1d8a69f3ea4a524adc376a6aaee06
  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.000945s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001773s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.005250s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.005896s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001717s ]
  6. SELECT * FROM `set` [ RunTime:0.004732s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001916s ]
  8. SELECT * FROM `article` WHERE `id` = 468406 LIMIT 1 [ RunTime:0.001504s ]
  9. UPDATE `article` SET `lasttime` = 1770478928 WHERE `id` = 468406 [ RunTime:0.078329s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000325s ]
  11. SELECT * FROM `article` WHERE `id` < 468406 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000561s ]
  12. SELECT * FROM `article` WHERE `id` > 468406 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006139s ]
  13. SELECT * FROM `article` WHERE `id` < 468406 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006105s ]
  14. SELECT * FROM `article` WHERE `id` < 468406 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001974s ]
  15. SELECT * FROM `article` WHERE `id` < 468406 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001177s ]
0.192873s