乐于分享
好东西不私藏

Runc 源码解析:(二)Runc 初始化容器环境

Runc 源码解析:(二)Runc 初始化容器环境

大家好,我是费益洲。上一篇文章,我们梳理了 runc 创建容器的整体流程,runc 创建容器的过程中,会通过内部调用 runc init 来为容器初始化容器环境,本文主要梳理 runc init 初始化容器环境的整体流程。

前置条件

runc 源码版本:v1.1.12

runc 项目地址:https://github.com/opencontainers/runc

执行顺序

runc init 从外部看是一个命令,但在进程内部是两段执行链路:

  • C 侧:主要负责创建容器所需的各类 namespace,并完成 namespace 的切换
  • Go 侧:在已经隔离好的命名空间内,把当前进程配置成容器内的目标进程,然后执行用户程序

这两个执行链路先执行 C 侧代码,然后由 C 侧代码唤起并执行 Go 侧代码,init.go 本身也明确写了这个顺序:

// line 15// This is the golang entry point for runc init, executed// before main() but after libcontainer/nsenter's nsexec().

🔔 需要注意的是:C 侧代码是在 runc init 进程启动前执行的

Why

为什么要在 Go runtime 启动前,用纯 C 的方式完成所有 namespace 的创建和切换,为什么不让 Go 来完成 namespace 的创建和切换?主要有以下三个原因:

  • Go runtime 是多线程的:调度器一启动就会创建多个 OS 进程(M)。但是 Linux 的 unshare(CLONE_NEWUSER) 等 syscall 要求调用进程是单线程的,多线程下这些 syscall 会直接 EINVAL。

  • CLOND_NEWPID 只对调用之后 fork 的子进程生效:这就意味着必须再 fork 一次,但是带 Go runtime fork 子进程语义非常复杂(goroutine 栈、futex、信号处理)

  • setns 对 PID/USER ns 也有“单线程”要求

综上所述,就有了现在的执行顺序:runc 会抢在 Go runtime 启动前,用纯 C 把所有 namespace 折腾完,最后让 stage-2 子进程"裸"地回到 Go 入口。这时 Go runtime 才第一次看到这个进程,而它已经在新的 ns 里、是单线程的,可以安心初始化。

C 侧

接下来我们就来先看下 C 侧代码的主要逻辑。主流程 runc init 通过匿名导入 nsenter 的方式出发触发了 C constructor:

init.go

import ( ...// line 9 _ "github.com/opencontainers/runc/libcontainer/nsenter" ...)

nsenter 的具体实现如下:

libcontainer/nsenter/nsenter.go

/*extern void nsexec();void __attribute__((constructor)) init(void) { nsexec();}*/import"C"

上述代码的主要作用就是把 nsexec() 函数注册处为__attribute__((constructor)),这里其实是利用了 cgo 构造函数 的机制。而 nsexec.c 的 stage0/1/2 才是最早执行的容器初始化逻辑。

由于 runc init 是一个“内嵌”的进程,所以 nsexec()会先根据 env 来判断是否是 init 进程:

libcontainer/nsenter/nsexec.c

// line 854voidnsexec(void){ ...// line 872 pipenum = getenv_int("_LIBCONTAINER_INITPIPE");if (pipenum < 0) {/* We are not a runc init. Just return to go runtime. */return; } ...}

第 872 获取的环境变量,在 runc create 时进行设置,然后通过 fd 传递过来,getenv_int 的逻辑如下:

libcontainer/nsenter/nsexec.c

// line 407staticintgetenv_int(constchar *name){char *val, *endptr;int ret; val = getenv(name);/* Treat empty value as unset variable. */if (val == NULL || *val == '\0')return -ENOENT; ret = strtol(val, &endptr, 10);if (val == endptr || *endptr != '\0')  bail("unable to parse %s=%s", name, val);/*  * Sanity check: this must be a non-negative number.  */if (ret < 0)  bail("bad value for %s=%s (%d)", name, val, ret);return ret;}

getenv_int 逻辑很简单,就是判断是否设置了环境变量 _LIBCONTAINER_INITPIPE,如果为空,说明这不是 init 进程,直接 return,让 Go 进程继续正常执行。如果设置了环境变量_LIBCONTAINER_INITPIPE,则认为这是 runc init,进而开始执行 stage-0。

stage-0

stage-0,即父协调者,是最先启动的。stage-0 启动后会先拉起 stage-1,并进入与子阶段的同步循环:

libcontainer/nsenter/nsexec.c

// line 1001-1003write_log(DEBUG, "spawn stage-1");stage1_pid = clone_parent(&env, STAGE_CHILD);// line 1014-1016write_log(DEBUG, "-> stage-1 synchronisation loop");stage1_complete = false;while (!stage1_complete) {

在这个循环中,stage-0 处理的关键消息包括:

  • SYNC_USERMAP_PLS:写 uid_map/gid_map,回 SYNC_USERMAP_ACK

  • SYNC_RECVPID_PLS:接收 stage-2 pid,并转发给外层 runc

  • SYNC_MOUNTSOURCES_PLS:下发 mount source fds

  • SYNC_CHILD_FINISH:stage-1 收尾。

相关代码如下:

libcontainer/nsenter/nsexec.c

// line 1023case SYNC_USERMAP_PLS: update_uidmap(...); update_gidmap(...); s = SYNC_USERMAP_ACK;// line 1050case SYNC_RECVPID_PLS: read(syncfd, &stage2_pid, sizeof(stage2_pid)); s = SYNC_RECVPID_ACK; dprintf(pipenum, "{\"stage1_pid\":%d,\"stage2_pid\":%d}\n", ...);

随后 stage-0 再进入和 stage-2 的同步循环,放行其继续执行:

// line 1116-1118s = SYNC_GRANDCHILD;write(syncfd, &s, sizeof(s));

stage-1

stage-1 可以理解为 namespace 的准备者,它是由 stage-0 拉起的,stage-1 的实际顺序非常关键:

1️⃣ join 已存在的 namespace:如果 config 里指定了 namespaces(例如 runc exec 或共享某个已有容器的 ns),先调用 join_namespaces() → setns() 进入这些已有 ns

关键代码如下(line 1169~1170):

libcontainer/nsenter/nsexec.c

// line 1169if (config.namespaces) join_namespaces(config.namespaces);

2️⃣ 若含 CLONE_NEWUSER,先 unshare(CLONE_NEWUSER),再请求 stage-0 代写 uid_map/gid_map 映射,再 setresuid(0,0,0)。之所以拆开是因为 UTS/mqueue 的 SELinux label 在 USER 未映射前 unshare 会出错。

关键代码如下所示(line 1191~1232):

libcontainer/nsenter/nsexec.c

// line 1191if (config.cloneflags & CLONE_NEWUSER) { try_unshare(CLONE_NEWUSER, "user namespace"); config.cloneflags &= ~CLONE_NEWUSER;/*  * We need to set ourselves as dumpable temporarily so that the  * parent process can write to our procfs files.  */if (config.namespaces) {  write_log(DEBUG, "temporarily set process as dumpable");if (prctl(PR_SET_DUMPABLE, 1000) < 0)   bail("failed to temporarily set process as dumpable"); }/*  * We don't have the privileges to do any mapping here (see the  * clone_parent rant). So signal stage-0 to do the mapping for  * us.  */ write_log(DEBUG, "request stage-0 to map user namespace"); s = SYNC_USERMAP_PLS;if (write(syncfd, &s, sizeof(s)) != sizeof(s))  bail("failed to sync with parent: write(SYNC_USERMAP_PLS)");/* ... wait for mapping ... */ write_log(DEBUG, "request stage-0 to map user namespace");if (read(syncfd, &s, sizeof(s)) != sizeof(s))  bail("failed to sync with parent: read(SYNC_USERMAP_ACK)");if (s != SYNC_USERMAP_ACK)  bail("failed to sync with parent: SYNC_USERMAP_ACK: got %u", s);/* Revert temporary re-dumpable setting. */if (config.namespaces) {  write_log(DEBUG, "re-set process as non-dumpable");if (prctl(PR_SET_DUMPABLE, 0000) < 0)   bail("failed to re-set process as non-dumpable"); }/* Become root in the namespace proper. */if (setresuid(000) < 0)  bail("failed to become root in user namespace");}

3️⃣ 其余 namespace(包含 mount/IPC/PID/NET/UTS) 一次性 unshare

关键代码如下所示(line 1244):

libcontainer/nsenter/nsexec.c

try_unshare(config.cloneflags & ~CLONE_NEWCGROUP, "remaining namespaces (except cgroupns)");

4️⃣ 再 clone 出 stage-2:因为 unshare(CLONE_NEWPID) 只让"将来 fork 出的子进程"在新 PID ns,所以必须再 fork 一次,stage-2 才真正在新 PID namespace 里 pid=1。

关键代码如下所示(line 1278):

libcontainer/nsenter/nsexec.c

stage2_pid = clone_parent(&env, STAGE_INIT);

stage-2

stage-2 可以理解为最终过渡进程(pre-Go 最后一跳)。stage-2 再拿到 stage-0 的放行信号后,会最终切换并返回 Go runtime。

关键代码如下所示:

libcontainer/nsenter/nsexec.c

// line 1342-1345read(syncfd, &s, sizeof(s));if (s != SYNC_GRANDCHILD) ...// line 1347-1354setsid();setuid(0);setgid(0);// line 1365-1367s = SYNC_CHILD_FINISH;write(syncfd, &s, sizeof(s));// line 1377-1380write_log(DEBUG, "<= nsexec container setup");write_log(DEBUG, "booting up go runtime ...");return;

这一步 return 之后,才进入 Go runtime,并继续执行 Go 侧 init.go

Go 侧

pre-Go 完成后,Go 侧 init() 才会运行:

init.go

// line 13funcinit() {iflen(os.Args) > 1 && os.Args[1] == "init" {// line 19-31  level, _ := strconv.Atoi(os.Getenv("_LIBCONTAINER_LOGLEVEL"))  logPipeFd, _ := strconv.Atoi(os.Getenv("_LIBCONTAINER_LOGPIPE"))  logrus.SetOutput(os.NewFile(uintptr(logPipeFd), "logpipe"))// line 34-35  factory, _ := libcontainer.New("")if err := factory.StartInitialization(); err != nil {   os.Exit(1)  } }}

这一段主要是设置日志管道,并进入 StartInitialization()StartInitialization() 会读取 parent 通过环境变量和 pipe 传入的信息,然后构造具体 initer:

libcontainer/factory_linux.go

// line 262func(l *LinuxFactory)StartInitialization()(err error) {// line 264-272 读取 _LIBCONTAINER_INITPIPE envInitPipe := os.Getenv("_LIBCONTAINER_INITPIPE") pipefd, _ := strconv.Atoi(envInitPipe) pipe := os.NewFile(uintptr(pipefd), "pipe")// line 289-296 读取 _LIBCONTAINER_INITTYPE / _LIBCONTAINER_FIFOFD envInitType := os.Getenv("_LIBCONTAINER_INITTYPE")// line 308-312 读取 _LIBCONTAINER_LOGPIPE logPipeFdStr := os.Getenv("_LIBCONTAINER_LOGPIPE") logPipeFd, _ := strconv.Atoi(logPipeFdStr)// line 334-340 构造并执行 i.Init() i, err := newContainerInit(it, pipe, consoleSocket, fifofd, logPipeFd, mountFds)return i.Init()}

libcontainer/init_linux.go

// line 79funcnewContainerInit(t initType, pipe *os.File, consoleSocket *os.File, fifoFd, logFd int, mountFds []int)(initer, error) {switch t {case initSetns:return &linuxSetnsInit{...}, nilcase initStandard:return &linuxStandardInit{...}, nil }}

对于 runc create -> runc init 这条链路来说,构造的类型是 initStandard。在 linuxStandardInit.Init() 中,核心顺序大致是:

1️⃣ 切换network/route、rootfs、console、hostname、apparmor、sysctl

2️⃣ syncParentReady(l.pipe) 告知父进程 ready

3️⃣ seccomp 与 namespace finalization

4️⃣ 关闭 pipe / log fd

5️⃣ 等待并写入 exec.fifo

6️⃣ 最终 system.Exec(...) 执行用户进程

关键代码如下所示:

libcontainer/standard_init_linux.go

// line 49func(l *linuxStandardInit)Init()error {// line 80-123 network/rootfs/console/finalizeRootfsif err := setupNetwork(l.config); err != nil {return err } ...// Finish the rootfs setup.if l.config.Config.Namespaces.Contains(configs.NEWNS) {if err := finalizeRootfs(l.config.Config); err != nil {return err  } } ...// line 161if err := syncParentReady(l.pipe); err != nil {return fmt.Errorf("sync ready: %w", err) } ...// line 171~188if l.config.Config.Seccomp != nil && !l.config.NoNewPrivileges {  seccompFd, err := seccomp.InitSeccomp(l.config.Config.Seccomp)if err != nil {return err  }if err := syncParentSeccomp(l.pipe, seccompFd); err != nil {return err  } }if err := finalizeNamespace(l.config); err != nil {return err }// finalizeNamespace can change user/group which clears the parent death// signal, so we restore it here.if err := pdeath.Restore(); err != nil {return fmt.Errorf("can't restore pdeath signal: %w", err) } ...// line 227~232 _ = l.pipe.Close()// Close the log pipe fd so the parent's ForwardLogs can exit.if err := unix.Close(l.logFd); err != nil {return &os.PathError{Op: "close log pipe", Path: "fd " + strconv.Itoa(l.logFd), Err: err} } ...// line 238~253 fifoPath := "/proc/self/fd/" + strconv.Itoa(l.fifoFd) fd, err := unix.Open(fifoPath, unix.O_WRONLY|unix.O_CLOEXEC, 0)if err != nil {return &os.PathError{Op: "open exec fifo", Path: fifoPath, Err: err} }if _, err := unix.Write(fd, []byte("0")); err != nil {return &os.PathError{Op: "write exec fifo", Path: fifoPath, Err: err} }// Close the O_PATH fifofd fd before exec because the kernel resets// dumpable in the wrong order. This has been fixed in newer kernels, but// we keep this to ensure CVE-2016-9962 doesn't re-emerge on older kernels.// N.B. the core issue itself (passing dirfds to the host filesystem) has// since been resolved.// https://github.com/torvalds/linux/blob/v4.9/fs/exec.c#L1290-L1318 _ = unix.Close(l.fifoFd) ...// line 280return system.Exec(name, l.config.Args[0:], os.Environ())}

🔔 需要注意的是,runc 执行用户程序之前会被阻塞:

libcontainer\standard_init_linux.go

// line 238fifoPath := "/proc/self/fd/" + strconv.Itoa(l.fifoFd)fd, err := unix.Open(fifoPath, unix.O_WRONLY|unix.O_CLOEXEC, 0)if err != nil {return &os.PathError{Op: "open exec fifo", Path: fifoPath, Err: err}}if _, err := unix.Write(fd, []byte("0")); err != nil {return &os.PathError{Op: "write exec fifo", Path: fifoPath, Err: err}}

open(O_WRONLY) 会一直 block,直到有读端打开。runc create 时 init 进程就停在这一行;当用户执行 runc start <id>,那边以 O_RDONLY 打开 > fifo,这里才返回,写入 "0",继续往下走。

总体来说,runc init = "C 代码先把命名空间隔离好 → Go 代码再把容器内部装修好 → 在 fifo 上等指令 → execve 让用户进程接管",三段式设计把"创建容器"与"启动容器"清晰地分开,既绕过了 Go runtime 的限制,又满足了 OCI 规范中 create/start 的语义解耦。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-27 20:32:16 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/665091.html
  2. 运行时间 : 0.118040s [ 吞吐率:8.47req/s ] 内存消耗:4,800.63kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=8551618b8c9940ec730159795714716e
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000591s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000819s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000314s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000303s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000509s ]
  6. SELECT * FROM `set` [ RunTime:0.000200s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000575s ]
  8. SELECT * FROM `article` WHERE `id` = 665091 LIMIT 1 [ RunTime:0.000517s ]
  9. UPDATE `article` SET `lasttime` = 1779885136 WHERE `id` = 665091 [ RunTime:0.001145s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000237s ]
  11. SELECT * FROM `article` WHERE `id` < 665091 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000469s ]
  12. SELECT * FROM `article` WHERE `id` > 665091 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000433s ]
  13. SELECT * FROM `article` WHERE `id` < 665091 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000720s ]
  14. SELECT * FROM `article` WHERE `id` < 665091 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001035s ]
  15. SELECT * FROM `article` WHERE `id` < 665091 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001151s ]
0.119743s