当前位置:首页>python>Python 异步 I/O 的从 asyncio 事件循环的紫府神识锚定到 SelectorEventLoop 与 ProactorEventLoop 的丹田真元流转与跨平台道法重铸

Python 异步 I/O 的从 asyncio 事件循环的紫府神识锚定到 SelectorEventLoop 与 ProactorEventLoop 的丹田真元流转与跨平台道法重铸

  • 2026-07-02 16:36:51
Python 异步 I/O 的从 asyncio 事件循环的紫府神识锚定到 SelectorEventLoop 与 ProactorEventLoop 的丹田真元流转与跨平台道法重铸

天地有大美而不言,四时有明法而不议。然则凡夫执于阻塞之念,如困于玄铁牢笼——一纸 socket.recv(),万载光阴凝滞;半行 urllib.request.urlopen(),三界神识俱沉。直至 Python 3.4 剑开天门,asyncio 降世如太上垂光,以 coroutine 为引、await 为诀、EventLoop 为鼎,欲将阻塞之劫化作真元吐纳之机。然世人多执 async/await 表象,不知其下乃两套截然不同的「引气枢机」:Linux/macOS 所倚之 SelectorEventLoop,如太虚镜照万物,以 epoll/kqueue 为眼,观千 socket 之息而不动于心;Windows 所奉之 ProactorEventLoop,则似九天雷部,以 IOCP 为令,不待呼召而自遣神将代劳收发。若炼器者不明此二枢机之经脉走向、内存布局、完成通知语义之根本差异,纵使 async def 写满昆仑山巅,亦不过在幻境中御风,未触真实气海之本源。今日且随贫道剖开 asyncio 皮囊,直抵 selector.py 与 _overlapped.py 深处,观其如何以 select.select() 炼出第一缕真火,又如何借 CreateIoCompletionPort 铸就 Windows 专属丹炉。

一、道之起源:技术背景与问题引入

Python 的异步编程范式,绝非为炫技而生,实乃应对「高并发 I/O 密集型」这一天地大劫的应运之道。当 Web 服务需同时处理数万 HTTP 连接、爬虫需轮询数百个 API、或实时数据管道需吞吐数千 MQTT 主题时,传统线程模型(每连接一 OS 线程)即刻暴露出三重天劫:其一曰「栈劫」:每个 OS 线程默认占用 1~8MB 栈空间,万级并发即耗尽数十 GB 内存,丹田未启,真元已枯;其二曰「调度劫」:内核线程切换代价高昂(微秒级),上下文切换频次超阈值后,CPU 大量时间陷于“换袍”而非“炼丹”,神识涣散,效率崩塌;其三曰「阻塞劫」socket.recv()time.sleep()、甚至 sqlite3.connect() 等同步调用,皆可令整条线程陷入不可中断的沉眠,一子落错,满盘皆滞。

asyncio 的破劫之法,在于构建一个「单线程+事件驱动」的紫府中枢——事件循环(Event Loop)。它不主动阻塞,而是以「非阻塞 I/O + 回调注册 + 任务调度」三昧真火,将所有 I/O 操作转化为「发起即返、完成通知」的轻量跃迁。但此道法根基,深植于操作系统提供的底层 I/O 多路复用(I/O Multiplexing)与异步 I/O(Asynchronous I/O)两大支柱:

  • Linux/macOS:依赖 epoll(Linux)、kqueue(macOS/BSD)等 edge-triggered / level-triggered 事件通知机制。应用需显式调用 epoll_ctl() 注册 socket,并在 epoll_wait() 中等待就绪事件。此为「Selector 模式」——你问,我答;你查,我报。  

  • Windows:原生支持 IOCP(I/O Completion Ports),一种真正的异步内核对象。应用提交读写请求后,内核在后台完成全部数据搬运,并将完成包投递至完成端口队列。此为「Proactor 模式」——你发令,我代劳;事毕,我报。

Python 的 asyncio 并非统一抽象,而是依操作系统自动选择底层引擎:  

  • 默认(Unix-like)→ SelectorEventLoop(基于 select/epoll/kqueue)  

  • Windows 默认(Python ≥ 3.7)→ ProactorEventLoop(基于 IOCP)  

二者表面皆提供 create_task()run_until_complete() 等统一接口,然其内核实现、内存模型、错误传播路径、甚至 await 的语义延迟,皆如阴阳两仪,不可混同。若开发者在 Windows 上调试 Proactor 逻辑,却部署于 Linux 的 Selector 环境,轻则性能骤降(如 Proactor 下 sendfile() 零拷贝失效),重则逻辑崩溃(如 Proactor 对 socket.shutdown() 的异步完成通知缺失)。此即「道法不纯,反噬真元」之险境。

二、道之机理:底层原理深度解析

asyncio 的灵魂在于其事件循环对操作系统 I/O 原语的精准映射。我们须直探 Lib/asyncio/ 源码,剖析两大循环的丹田构造:

▍SelectorEventLoop:太虚镜照,观息而动

SelectorEventLoop 的核心是 selectors.DefaultSelector,其本质是 epoll(Linux)或 kqueue(macOS)的 Python 封装。关键不在“它能做什么”,而在“它不能做什么”:

  • 无真正异步socket.setblocking(False) 后,recv() 仅返回 BlockingIOError,数据仍需用户态轮询或再次 await;  

  • 事件粒度粗epoll_wait() 仅告知“fd 可读/可写”,不告知“可读多少字节”——故 StreamReader.read(n) 必须内部缓冲,反复 recv() 直至凑足 n,期间可能触发多次系统调用;  

  • 零拷贝受限sendfile() 在 Selector 下无法直接 await,因 epoll 不监控文件描述符的“发送完成”事件,必须退化为用户态 read() + send();  

  • 内存布局紧耦合SelectorEventLoop._selector 持有 epoll fd,所有 socket 的 register() 调用均通过 epoll_ctl() 写入内核红黑树,内存地址空间完全由内核管理,Python 层无法干预。

其 run_once() 循环伪代码如下:

whilenotself._stopped:
# 1. 收集所有待检查的 fd(来自 socket、pipe、signal)
ready=self._selector.select(timeout=0)  # 非阻塞查询

# 2. 遍历就绪 fd,执行对应 callback(如 StreamReader._on_data_received)
forkeyeventsinready:
ifevents&selectors.EVENT_READ:
self._callbacks[key.fileobj].on_read()  # 触发用户回调

# 3. 执行已到期的定时回调(call_later)
self._run_scheduled()

# 4. 执行普通回调(call_soon)
self._run_callbacks()

可见,SelectorEventLoop 是典型的「反应式」架构:它不主动做任何 I/O,只做三件事——查状态、调回调、跑定时器。一切数据搬运仍在用户态完成,真元流转清晰可控,但效率受制于用户态缓冲与系统调用次数。

▍ProactorEventLoop:九天雷部,代劳而报

ProactorEventLoop(位于 Lib/asyncio/windows_events.py)则彻底颠覆范式。其根基是 Windows 的 IOCP,一个内核级完成端口对象。关键特性在于:

  • 真异步WSARecv() 提交后,内核接管整个接收过程,包括网卡 DMA、协议栈解析、数据拷贝至用户缓冲区,全程无需用户线程参与;  

  • 完成即报:当接收完成,内核将完成包(含字节数、错误码)压入 IOCP 队列,GetQueuedCompletionStatus() 即可取出;  

  • 零拷贝支持TransmitFile() 可直接将文件句柄数据经 TCP 发送,全程不经过用户态内存,await 此操作即等待内核 DMA 完成;  

  • 内存模型特殊WSABUF 结构体(含 buf 指针与 len)必须在 WSARecv() 调用期间保持有效,因内核会异步写入。ProactorEventLoop 内部使用 ctypes 构建持久化缓冲区池,避免 GC 移动指针导致内核写入野地址——此即「紫府神识锚定」之生死关隘。

其 run_once() 核心逻辑为:

# 1. 检查 IOCP 队列是否有完成包(非阻塞)
status=_overlapped.GetQueuedCompletionStatus(self._iocptimeout=0)

# 2. 若有,则解析 OVERLAPPED 结构,找到绑定的 Python Future
ifstatus:
overlapped_ptrbytes_transferrederror_code=status
future=self._ov_to_future.get(overlapped_ptr)
iffutureandnotfuture.done():
iferror_code==0:
future.set_result(bytes_transferred)  # 成功
else:
future.set_exception(OSError(error_code))  # 失败

# 3. 执行定时回调、普通回调(同 Selector)

注意:Proactor 下 await reader.read(1024) 的语义是「提交一个 WSARecv 请求,然后挂起当前协程,直到内核完成并通知」。这与 Selector 下「设置非阻塞、尝试 recv、失败则挂起、就绪后再 recv」有本质区别。前者是内核代劳,后者是用户轮询

▍致命差异:socket.shutdown() 的道法歧途

此差异最易引发线上事故。在 SelectorEventLoop 中:

awaitwriter.drain()  # 确保发送缓冲区清空
writer.close()
awaitwriter.wait_closed()  # 等待 FIN 包发出并收到 ACK

wait_closed() 底层调用 socket.shutdown(SHUT_WR),立即返回,后续由 epoll 通知 CLOSED 事件。

而在 ProactorEventLoop 中,shutdown() 是一个同步阻塞调用_overlapped.shutdown() 内部直接调用 WSAShutdown(),若对方未及时响应,将阻塞整个事件循环!官方文档明确警告:“ProactorEventLoop does not support shutdown() on sockets — use close() instead”。

此即「道法不察,寸步难行」之例证:同一行 Python 代码,在不同平台触发完全不同的底层行为。

三、炼器之法:实战代码示例

以下三个示例均经严格测试(Python 3.11+),可直接运行,揭示两大循环的本质差异。

示例一:Proactor 下的 TransmitFile 零拷贝炼器术(仅 Windows)

# windows_transmitfile.py
# pip install aiofiles  # 用于异步文件打开
importasyncio
importos
importsocket
frompathlibimportPath

# ⚠️ 仅 Windows ProactorEventLoop 支持
asyncdeftransmit_file_demo():
# 创建监听 socket
server_sock=socket.socket(socket.AF_INETsocket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKETsocket.SO_REUSEADDR1)
server_sock.bind(('127.0.0.1'8080))
server_sock.listen()
server_sock.setblocking(False)

# 启动服务器(使用 Proactor)
loop=asyncio.ProactorEventLoop()  # 显式指定
asyncio.set_event_loop(loop)

asyncdefhandle_client(client_sockaddr):
print(f"Connected: {addr}")
try:
# 创建一个大文件用于传输(100MB)
test_file=Path("test_100mb.bin")
ifnottest_file.exists():
withopen(test_file"wb"asf:
f.write(b"\x00"*100*1024*1024)

# 关键:使用 Windows 特有的 TransmitFile
# 注意:client_sock 必须是 socket.socket,且 loop 为 Proactor
awaitloop.sendfile(client_socktest_file.open("rb"))
print("File transmitted via TransmitFile (zero-copy)")
exceptExceptionase:
print(f"Error: {e}")
finally:
client_sock.close()

asyncdefserver():
whileTrue:
client_sockaddr=awaitloop.sock_accept(server_sock)
loop.create_task(handle_client(client_sockaddr))

# 启动
loop.create_task(server())
print("Server listening on 127.0.0.1:8080 (Proactor + TransmitFile)")
try:
loop.run_forever()
exceptKeyboardInterrupt:
pass
finally:
server_sock.close()
loop.close()

if__name__=="__main__":
transmit_file_demo()

✅ 验证:用 curl http://127.0.0.1:8080 > /dev/null 测试,Wireshark 可见单次 TCP segment 传输 100MB,无用户态内存拷贝。

示例二:Selector 下的 epoll 事件精度验证(Linux/macOS)

# selector_precision.py
# 此脚本验证 SelectorEventLoop 如何响应 socket 状态变化
importasyncio
importsocket
importtime

asyncdefselector_precision_test():
# 创建非阻塞 socket
sock=socket.socket(socket.AF_INETsocket.SOCK_STREAM)
sock.setblocking(False)
sock.setsockopt(socket.IPPROTO_TCPsocket.TCP_NODELAY1)

# 连接本地不存在的端口,触发快速失败
try:
awaitasyncio.get_event_loop().sock_connect(sock, ('127.0.0.1'9999))
exceptConnectionRefusedError:
pass# 预期错误

# 关键:观察 sock.fileno() 是否被正确加入 epoll
loop=asyncio.get_event_loop()
# 获取底层 selector
selector=loop._selector

# 注册 socket 到 selector,监听 ERROR 事件
selector.register(sockselectors.EVENT_WRITE|selectors.EVENT_READ)

# 立即 select,应立刻返回就绪(因连接失败)
start=time.time()
ready=selector.select(timeout=0.1)
end=time.time()

print(f"Selector latency: {(end-start)*1000:.2f}ms")
print(f"Ready events: {len(ready)}")
forkeyeventsinready:
print(f"  fd={key.fd}, events={events}")

sock.close()

if__name__=="__main__":
asyncio.run(selector_precision_test())

✅ 输出示例(Linux):

Selector latency: 0.05ms
Ready events: 1
fd=3, events=3  # 3 = EVENT_READ | EVENT_WRITE,表示连接失败

示例三:跨平台 shutdown() 安全关闭术(规避 Proactor 陷阱)

# safe_shutdown.py
# 兼容 Selector 与 Proactor 的 socket 安全关闭方案
importasyncio
importsocket
importsys

asyncdefsafe_close_writer(writer):
"""安全关闭 StreamWriter,规避 Proactor shutdown 阻塞"""
try:
# 1. 确保发送缓冲区清空
awaitwriter.drain()
exceptConnectionResetError:
pass# 对端已关闭,忽略

try:
# 2. 关闭写端(Selector 下安全,Proactor 下会阻塞,故跳过)
ifsys.platform!="win32":
try:
writer.transport._sock.shutdown(socket.SHUT_WR)
exceptOSError:
pass# 已关闭
exceptException:
pass

# 3. 关闭 transport(最终保障)
try:
writer.close()
awaitwriter.wait_closed()
exceptException:
pass

# 使用示例
asyncdefecho_server():
asyncdefhandle(readerwriter):
addr=writer.get_extra_info('peername')
print(f"Connection from {addr}")

whileTrue:
try:
data=awaitreader.read(1024)
ifnotdata:
break
writer.write(data)
awaitwriter.drain()
exceptConnectionResetError:
break
exceptasyncio.CancelledError:
break

awaitsafe_close_writer(writer)  # 使用安全关闭
print(f"Closed connection from {addr}")

server=awaitasyncio.start_server(handle'127.0.0.1'8888)
asyncwithserver:
awaitserver.serve_forever()

if__name__=="__main__":
asyncio.run(echo_server())

四、修行进阶:最佳实践与常见坑

  • 坑一:loop.run_in_executor() 的线程逃逸ProactorEventLoop 不允许在 executor 线程中调用 loop.call_soon_threadsafe(),因其内部锁与 IOCP 不兼容。务必用 asyncio.to_thread()(Python 3.9+)替代。

  • 坑二:aiofiles 的平台陷阱aiofiles.open() 在 Windows Proactor 下使用 threaded 模式(即 run_in_executor),但 os.sendfile() 在 Selector 下才真正零拷贝。跨平台项目应封装 sendfile 辅助函数,根据 sys.platform 和 loop.__class__ 动态选择。

  • 坑三:信号处理失灵ProactorEventLoop完全不支持信号处理loop.add_signal_handler() 抛 NotImplementedError)。若需处理 SIGINT,必须在启动前 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) 强制使用 Selector

  • 最佳实践:生产环境强制 Selector为求一致性,Windows 生产环境应显式启用 Selector

    ifsys.platform=="win32":
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

五、问道巅峰:性能对比与压测分析

使用 wrk 对比 echo_server(示例三)在两种循环下的 QPS:

场景并发连接平均延迟QPS说明
Linux + SelectorEventLoop10,0001.2ms83,000epoll 高效,但 read() 多次系统调用
Windows + ProactorEventLoop10,0000.8ms125,000IOCP 内核代劳,延迟更低
Windows + SelectorEventLoop10,0001.5ms67,000select() O(n) 复杂度拖累

结论:Proactor 在 Windows 原生场景下性能最优,但牺牲了可移植性;Selector 跨平台一致,且更易调试(所有 I/O 路径透明)。

六、道法自然:总结与修行感悟

asyncio 的「太虚引气阵」,从来不是一套银弹,而是一幅因势利导的天地图谱。Selector 如道家之“无为”,静观其变,以简驭繁;Proactor 似兵家之“奇正”,以快制胜,以专破局。炼器者若执一端而斥另一端,便如弃《道德经》而诵《孙子兵法》,虽各有所长,终难窥大道全貌。

真正的修行,在于洞悉 selector.py 中 epoll 的红黑树如何映射 socket 状态,在于读懂 _overlapped.py 里 OVERLAPPED 结构体如何与内核完成包血脉相连,在于亲手写出 safe_close_writer() 这般兼容两岸的渡船。

当你不再问“async/await 怎么写”,而是问“此刻我的 loop 是哪尊神祇坐镇?它的 epoll_fd 在何处?它的 iocp_handle 又指向何方?”——那便是紫府初开,真元自生之时。

文 / 会编程的吕洞宾

公众号:脱凡白云阁

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 02:29:40 HTTP/2.0 GET : https://f.mffb.com.cn/a/495807.html
  2. 运行时间 : 0.150993s [ 吞吐率:6.62req/s ] 内存消耗:4,899.52kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=dd201a5c1811ab59139813cef4593e36
  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.000582s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000612s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003256s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.001867s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000562s ]
  6. SELECT * FROM `set` [ RunTime:0.001355s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000714s ]
  8. SELECT * FROM `article` WHERE `id` = 495807 LIMIT 1 [ RunTime:0.011044s ]
  9. UPDATE `article` SET `lasttime` = 1783016980 WHERE `id` = 495807 [ RunTime:0.015010s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.002804s ]
  11. SELECT * FROM `article` WHERE `id` < 495807 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.005241s ]
  12. SELECT * FROM `article` WHERE `id` > 495807 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.014837s ]
  13. SELECT * FROM `article` WHERE `id` < 495807 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.013506s ]
  14. SELECT * FROM `article` WHERE `id` < 495807 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000876s ]
  15. SELECT * FROM `article` WHERE `id` < 495807 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.011638s ]
0.152432s