当前位置:首页>Linux>重温并发任务:如何优雅地创建linux系统中进程

重温并发任务:如何优雅地创建linux系统中进程

  • 2026-02-05 08:15:40
重温并发任务:如何优雅地创建linux系统中进程

点击↑深色口袋物联,选择关注公众号,获取更多内容,不迷路


线程以其轻量级、低切换开销和零拷贝通信,成为了高并发场景的首选。然而,进程作为操作系统资源分配的最小单位,其“强隔离”与“高稳定性”的特性依然是线程无法替代的基石。

1基本进程创建

在 Linux 应用层开发中,通过使用 fork进行创建进程,此函数与一般函数最大的不同,就是:调用一次fork ,会两次返回

  • • 如果返回小于0,则创建失败
  • • 如果返回等于0,则为子进程
  • • 如果返回大于1,则为父进程,

如下是一个简单的进程示例,通过全局变量,可以说明进程间,全局变量是隔离的,不共享的

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>// 全局变量,用于验证:进程资源是否隔离int g_val = 10;int main() {    printf("===== Linux 多进程示例 (fork) =====\n");    printf("父进程PID: %d, 全局变量初始值: g_val = %d\n", getpid(), g_val);    // 创建子进程,fork()调用一次,返回两次    pid_t pid = fork();    if (pid < 0) {        perror("fork 创建子进程失败");        exit(EXIT_FAILURE);    }     // 子进程执行区:fork返回0    else if (pid == 0) {        printf("\n【子进程】PID = %d, 父进程PPID = %d\n", getpid(), getppid());        printf("【子进程】修改前 g_val = %d\n", g_val);        // 子进程修改全局变量        g_val = 200;        printf("【子进程】修改后 g_val = %d\n", g_val);        exit(EXIT_SUCCESS); // 子进程执行完毕退出    }     // 父进程执行区:fork返回子进程的PID(大于0)    else {        // 父进程阻塞等待子进程执行完毕,避免子进程成为僵尸进程        wait(NULL);        printf("\n【父进程】PID = %d\n", getpid());        printf("【父进程】全局变量g_val = %d (未被子进程修改!)\n", g_val);    }    return 0;}

以上输出结果如下,即全局变量 g_val默认为10,在子进程中将其修改为200,在主进程中,仍然为10。所以进程间是隔离的

===== Linux 多进程示例 (fork) =====父进程PID: 3069239, 全局变量初始值: g_val = 10【子进程】PID = 3069240, 父进程PPID = 3069239【子进程】修改前 g_val = 10【子进程】修改后 g_val = 200【父进程】PID = 3069239【父进程】全局变量g_val = 10 (未被子进程修改!)

2 常见的坑

在 Linux 应用层开发中,fork 是高频踩坑点,很多 bug 隐蔽性极强,调试难度大,这些坑大多源于对 fork 底层逻辑理解不透彻,也是新手和进阶工程师的核心分水岭,下面是常见的忽略点

坑 1:忽略 fork 的「调用一次,返回两次」特性,逻辑执行两遍

现象:fork 之后的代码,父进程执行一次,子进程又执行一次,导致重复打印、重复处理数据、重复调用接口。

根源:误以为 fork 是 “调用后跳转子进程执行,父进程等待”,本质是父子进程共享代码段,fork 后代码并发执行。

避坑方案必须通过 fork 的返回值严格区分父子进程逻辑,所有业务逻辑都要写在pid==0(子进程)或pid>0(父进程)的分支中,绝不允许 fork 后无分支执行核心业务。

坑 2:子进程退出后不回收,产生「僵死进程(僵尸进程)」

现象:程序运行一段时间后,通过ps -ef | grep defunct能看到大量<defunct>状态的进程,系统可用进程数越来越少,最终无法创建新进程。

根源:子进程退出时,内核会保留其退出状态(退出码、终止信号),等待父进程通过wait()/waitpid()回收;如果父进程不做回收操作,子进程就会变成僵死进程,占用 PID 资源且无法被杀死(kill -9 无效)。

避坑3 种方案

  1. 1. 父进程主动回收:在父进程中调用wait(NULL)(阻塞等待任意子进程退出)或waitpid(pid, &status, 0)(精准等待指定子进程),最稳妥;
  2. 2. 设置信号忽略:在 fork 前调用signal(SIGCHLD, SIG_IGN),告诉内核 “子进程退出时无需保留状态,自动回收”,非阻塞最优解;
  3. 3. 父进程先退出:子进程会被 init 进程(PID=1)接管,init 会自动回收子进程的退出状态,适合父进程无需管理子进程的场景。

坑 3:父子进程共享文件偏移量,导致文件 / 网络读写错乱

现象:父进程打开一个文件或socket,fork 后父子进程同时读写,出现数据重叠、漏读、写覆盖的问题。

根源:fork 只复制文件描述符表,不复制内核的文件结构体(struct file),父子进程的同一个文件描述符,指向内核中同一个文件结构体,文件偏移量是该结构体的成员,属于共享资源。

避坑方案

  1. 1. 父子进程如果需要独立读写,fork 后立即对文件描述符执行 dup/dup2 重新复制,使用新的描述符进行读写;
  2. 2. 读写前通过lseek()手动调整文件偏移量,保证读写位置正确;
  3. 3. 核心原则:共享打开的文件描述符,切勿父子进程并发读写

坑 4:fork 后父子进程竞争全局资源,导致数据脏读 / 脏写

现象:父子进程同时修改同一个全局变量、配置文件、硬件寄存器,最终数据值异常,出现不可复现的逻辑错误。

根源:虽然 fork 的 COW 机制会让内存修改隔离,但fork 之前的全局变量初始化数据是共享的,如果 fork 后立刻修改,会触发拷贝,但修改瞬间的竞争依然会导致数据异常;硬件资源 / 配置文件属于进程外资源,无隔离性。

避坑方案

  1. 1. 内存资源:fork 后父子进程的全局变量、堆内存,修改时无需加锁(COW 隔离),但fork 前不要让全局变量处于 “待修改” 状态
  2. 2. 进程外资源:文件、硬件、网络等共享资源,必须通过锁、信号量、管道实现互斥访问,禁止并发修改。

坑 5:误以为 fork 能创建多线程,或在多线程中滥用 fork

现象:在多线程程序中调用 fork,子进程中只有调用 fork 的那个线程存活,其他线程全部被终止,且持有锁的线程被终止后,子进程会出现死锁。

根源:Linux 的规则:多线程中调用 fork,子进程仅保留发起 fork 的线程,其他线程会被内核强制终止,且不会释放持有的互斥锁

避坑方案禁止在多线程程序中随意调用 fork,如果必须使用,需满足两个条件:① fork 后子进程立刻执行exec()系列函数替换进程映像;② fork 前释放所有线程持有的锁。

坑 6:fork 后子进程忘记退出 / 执行 exec,导致进程泛滥

现象:程序运行后,通过ps查看会发现进程数呈指数级增长,系统负载飙升。

根源:子进程执行完业务逻辑后,没有调用exit()/_exit()退出,也没有执行exec()替换进程,导致子进程继续执行父进程的后续代码,甚至再次调用 fork。

避坑方案:子进程的业务逻辑执行完毕后,必须主动调用 exit (EXIT_SUCCESS) 退出,这是应用层开发的铁律。

坑 7:忘记在适当位置关闭文件描述符

现象:fork 会复制文件描述符,也会复制用户态的 stdio 缓冲区。如果 fork 前有 printf 但未 fflush,父子进程退出时可能会各自刷新缓冲区,导致输出重复。对策:在 fork 前手动 fflush(NULL) 刷新所有流。

坑 8:信号处理器使用不当导致竞争条件

现象:如果父进程在持有互斥锁的状态下调用了 fork(),子进程会复制该锁的状态(已被加锁)。但子进程中只有执行 fork 的那个线程存在,其他持有锁的线程并未复制过来。后果:子进程如果试图再次加锁,就会陷入永久死锁;或者试图解锁,也可能破坏父进程的锁状态。对策:fork 后,子进程应立即调用 exec 替换内存映像(清空锁状态),或者在多线程程序中严禁直接使用 fork,改用 pthread_atfork 注册处理函数来清理锁状态。

3 底层逻辑

从应用层看,fork() 只是一个函数调用;从glibc_2.35源码中,执行如下调用

fork  git\posix\fork.c    __libc_fork        _Fork git\sysdeps\nptl\_Fork.c            arch_fork   git\sysdeps\unix\sysv\linux\arch-fork.h                INLINE_CLONE_SYSCALL                   INLINE_SYSCALL_CALL    git\sysdeps\unix\sysdep.h                    git\sysdeps\unix\sysv\linux\arm\sysdep.h            INTERNAL_SYSCALL_CALL

但从内核视角看,它是一场浩大的资源复制工程。

SYSCALL_DEFINEx(clone, ...,   kernel/fork.c    kernel_clone(&args)         copy_process

内核执行**copy_process()**,完整复制父进程的 task_struct、mm_struct(内存描述符)、页表、文件描述符表和信号处理机制。

现代 Linux 为了优化 fork 性能,广泛使用了 COW 技术。虽然子进程看似拥有独立的内存空间,但在实际写入数据前,父子进程物理上共享同一块内存页。

即使使用了 COW,内核仍需复制页表项。在 ARM 架构下,这意味着修改 TTBR0_EL1 寄存器,导致 TLB(Translation Lookaside Buffer)失效。这正是 fork 开销远大于线程的根本原因。

资源继承的核心注意点

  • • 子进程会完整继承父进程的所有打开的文件描述符(socket、文件、管道、设备节点)、工作目录、用户 ID / 组 ID、信号掩码、环境变量,但文件描述符的文件偏移量是共享的!比如父进程打开文件读到偏移量 100,子进程继续读会从 100 开始,而非从头开始。
  • • 子进程继承父进程的内存数据(堆、栈、全局变量),但基于 COW 机制,修改时会独立拷贝,父子进程的内存修改互不影响。
  • • 子进程不会继承父进程的僵死子进程、定时器(alarm)、pending 信号,这三类资源属于父进程私有父子进程的执行规则注意
  • • 父子进程并发独立运行,内核调度无先后顺序,不要写依赖父进程先执行 / 子进程先执行的逻辑,所有有序执行必须通过管道、信号、等待等机制实现。
  • • 父子进程拥有独立的 PCB,各自的errno、信号处理函数(继承后可独立修改)、进程优先级都是独立的。
  • • 子进程的运行状态完全不影响父进程,反之亦然 —— 这是进程隔离的核心优势,也是 fork 的核心价值内存与性能注意事项
  • • fork 的进程创建开销远大于线程,不要高频调用 fork 创建大量子进程,会耗尽系统内存和进程数资源。
  • • COW 机制是优化,但如果 fork 后立刻大量修改内存数据,会触发大量内存拷贝,抵消 COW 的优势,这种场景不适合用 fork。

4 使用场景

在 Linux 应用层开发中,fork 不是万能的,也不是过时的,它有明确且不可替代的使用场景,与线程形成完美互补。

很多开发者纠结「用 fork 还是用线程」,本质是没搞懂二者的场景边界:

线程适合「高效并发、资源共享、低开销」的场景,fork 适合「强隔离、独立运行、故障无牵连」的场景

fork 的所有使用场景,都围绕其核心优势:子进程是独立的进程实体,拥有完全隔离的地址空间,子进程的崩溃、异常、内存泄漏,不会影响父进程

这一优势是线程无法替代的,也是 fork 至今在 Linux 开发中不可或缺的核心原因,

适合fork的场景

场景 1:需要「故障隔离」的业务模块,核心首选 fork这是 fork 最核心、最常用的场景,优先级第一。比如:

  • • 嵌入式 Linux 中,硬件驱动的异常检测、第三方未开源的插件执行、高风险的算法运算,用 fork 创建子进程运行,即使子进程崩溃(段错误、总线错误),父进程依然能正常运行,保障系统核心业务不中断;
  • • 服务器开发中:Nginx 的多进程模型,master 主进程管理 worker 子进程,单个 worker 进程处理请求崩溃,不会影响 master 和其他 worker,保障服务高- 可用;
  • • 工具开发中:执行系统命令、调用外部可执行程序,用 fork+exec 实现,外部程序的异常不会影响主程序。
  • • 安全沙箱:隔离不可信代码执行,如 Chrome 浏览器、Android App 运行环境。渲染引擎或恶意代码崩溃不应导致整个主程序挂掉。进程间的地址空间完全隔离,一个进程的野指针无法破坏另一个进程的数据。

场景 2:需要执行「独立的子任务」,且子任务无需与父进程共享大量数据日志归档、文件备份、数据导出、定时清理缓存等后台任务,这些任务与主业务无耦合,无需共享内存数据,用 fork 创建子进程独立执行,子进程执行完毕后退出即可,父进程无需等待,不阻塞主业务。

场景 3:实现「多进程并发处理」,且需要高可靠性的服务端程序经典的「一请求一进程」模型,比如早期的 Apache 服务器,父进程监听端口,收到客户端请求后 fork 一个子进程处理该请求,子进程处理完毕后退出。该模型的优势是:单个请求的处理崩溃,不会影响其他请求和父进程,服务稳定性极高;缺点是开销比线程大,适合并发量适中、对稳定性要求高于性能的场景。

场景 4:需要「进程守护」的业务,父进程监控子进程运行状态比如嵌入式 Linux 的看门狗进程、工业网关的核心业务监控:父进程 fork 出子进程运行核心业务,父进程通过waitpid()的非阻塞模式,实时监控子进程的运行状态;如果子进程崩溃、卡死,父进程能立刻感知并重启子进程,实现业务的自动恢复,这是工业级项目的标准高可用方案。

场景 5:配合 exec 系列函数,实现「程序替换」,执行外部可执行文件这是 Linux 中执行外部程序的标准方式:fork 创建子进程,子进程调用exec()(execl/execv/execvp 等)替换自身的进程映像,执行外部程序。该方式的核心优势是:外部程序的运行环境与父进程完全隔离,外部程序的资源占用、崩溃都不会影响父进程,这是system()函数的底层实现逻辑(system = fork + exec + waitpid)。

场景6:服务守护进程:传统的Unix守护进程模式,系统的关键服务(如 sshd, syslogd)通常独立运行。如果业务层代码出现死锁或段错误,守护进程依然存活,甚至可以监控并重启业务进程。

// 经典的双重fork创建守护进程pid_t pid = fork();if (pid == 0) {          // 第一次fork    setsid();            // 创建新会话    pid = fork();        // 第二次fork    if (pid == 0) {      // 真正的守护进程        chdir("/");        umask(0);        close_all_fds();        // 守护进程主逻辑    }    exit(0);             // 第一次fork的子进程退出}waitpid(pid, NULL, 0);   // 父进程等待

不适合fork()的场景

需要频繁创建销毁的执行单元:线程更合适

大量数据共享的并发任务:共享内存+线程更高效父子进程内存默认隔离,数据交换必须通过管道、消息队列、共享内存或 Unix Domain Socket。这比线程间的全局变量共享要复杂得多,且涉及内核态拷贝,增加了开发难度和延迟

实时性要求高的应用:进程切换开销大进程切换不仅涉及寄存器保存,还涉及 MMU 切换(刷新 TLB)。在 ARM Cortex-A 等平台上,进程切换延迟可达线程的数十倍

内存受限的嵌入式系统:进程的内存开销不可忽视即使是 COW,每个进程也拥有独立的 task_struct、内核栈和页表。在内存受限的嵌入式设备(如 512MB RAM)上,大量创建进程会迅速耗尽系统资源。

总之:当你需要「隔离故障、独立运行、互不影响」时,优先用 fork;当你需要「高效并发、共享数据、低开销」时,优先用线程。二者不是对立关系,而是互补关系,工业级项目中最优秀的架构是「多进程 + 多线程」混合模型。

5示例

示例1 基于管道(Pipe)的进程间通信

下面是基本管道(Pipe)的进程间通信,其实早期android的升级流程,就是在recvoery中使用进程间管道进行通信的,完成升级任务。

此示例演示父进程通过管道向子进程发送数据

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#define BUF_SIZE 1024int main(void) {    int pipefd[2];     pid_t pid;    char write_buf[] = "Hello from Parent via Pipe!";    char read_buf[BUF_SIZE];    // 1. 创建管道    if (pipe(pipefd) == -1) {        perror("pipe");        exit(EXIT_FAILURE);    }    // 2. 创建进程    pid = fork();    if (pid < 0) {        perror("fork");        exit(EXIT_FAILURE);    } else if (pid == 0) {        // --- 子进程 ---        close(pipefd[1]); // 关闭写端        // 从管道读取数据        int nbytes = read(pipefd[0], read_buf, sizeof(read_buf));        if (nbytes > 0) {            printf("子进程 (PID: %d) 收到: %s\n", getpid(), read_buf);        }        close(pipefd[0]); // 关闭读端        exit(EXIT_SUCCESS);    } else {        // --- 父进程 ---        close(pipefd[0]); // 关闭读端        // 向管道写入数据        write(pipefd[1], write_buf, strlen(write_buf) + 1);        close(pipefd[1]); // 关闭写端,发送 EOF        wait(NULL); // 回收子进程        printf("父进程: 通信结束。\n");    }    return 0;}

运行结果如下所示:

子进程 (PID: 3070059) 收到: Hello from Parent via Pipe!父进程: 通信结束。

示例2 多进程网络服务器 

下面是一个多进程网络服务器示例。服务器接收客户端请求后,创建一个响应进程,进行与客户端通信,当客户端关闭时,响应进程结束

服务端的示例代码如下

#include <stdio.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <stdlib.h>#include <signal.h>#include <string.h>void handle_client(int fd) {    char buf[1024];    ssize_t n;    while (n = read(fd, buf, sizeof(buf))) {        if (n < 0) {            perror("read error");            break;        }        printf("client data:%s\n",buf);        if (write(fd, buf, n) != n) {            perror("write error");            break;        }    }    printf("close client\n");    close(fd);}int main() {    // 僵尸进程处理    struct sigaction sa;    sa.sa_handler = SIG_IGN;    sigaction(SIGCHLD, &sa, NULL);    int server_fd = socket(AF_INET, SOCK_STREAM, 0);    if (server_fd < 0) {        perror("socket failed");        exit(EXIT_FAILURE);    }    struct sockaddr_in addr = {        .sin_family = AF_INET,        .sin_port = htons(8080),        .sin_addr.s_addr = htonl(INADDR_ANY)    };    if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {        perror("bind failed");        close(server_fd);        exit(EXIT_FAILURE);    }    if (listen(server_fd, 5) < 0) {        perror("listen failed");        close(server_fd);        exit(EXIT_FAILURE);    }    printf("ready for server\n");    while (1) {        int client_fd = accept(server_fd, NULL, NULL);        if (client_fd < 0) {            perror("accept failed");            continue;        }        pid_t pid = fork();        if (pid < 0) {            perror("fork failed");            close(client_fd);            continue;        }        if (pid == 0) {            close(server_fd);            handle_client(client_fd);            exit(EXIT_SUCCESS);        }        close(client_fd);    }    return 0;}

下面是客户端的示例代码

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <string.h>#include <errno.h>#define SERVER_IP "127.0.0.1"  // 测试时使用本地环回地址#define SERVER_PORT 8080#define BUFFER_SIZE 1024int main() {    int sockfd;    struct sockaddr_in server_addr;    char buffer[BUFFER_SIZE];    // 创建客户端套接字    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {        perror("Client socket creation failed");        exit(EXIT_FAILURE);    }    // 设置服务器地址信息    memset(&server_addr, 0, sizeof(server_addr));    server_addr.sin_family = AF_INET;    server_addr.sin_port = htons(SERVER_PORT);    // 转换IP地址格式    if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {        perror("Invalid server address");        close(sockfd);        exit(EXIT_FAILURE);    }    // 尝试连接服务器    if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {        perror("Connection to server failed");        close(sockfd);        exit(EXIT_FAILURE);    }    printf("Connected to server %s:%d\n", SERVER_IP, SERVER_PORT);    printf("Type messages (press Ctrl+D or 'exit' to quit):\n");    // 交互式通信循环    while (1) {        printf("> ");        fflush(stdout);        // 读取用户输入        if (fgets(buffer, BUFFER_SIZE, stdin) == NULL) {            if (feof(stdin)) break;  // 检测EOF (Ctrl+D)            perror("fgets error");            break;        }        // 退出条件检查        size_t len = strlen(buffer);        if (len > 0 && buffer[len-1] == '\n') {            buffer[--len] = '\0';  // 去除换行符            if (strcmp(buffer, "exit") == 0) break;        }        // 发送数据到服务器        ssize_t sent = send(sockfd, buffer, len, 0);        if (sent < 0) {            perror("Send failed");            break;        } else if (sent == 0) {            printf("Server closed connection\n");            break;        }        // 接收服务器回显        ssize_t received = recv(sockfd, buffer, BUFFER_SIZE-1, 0);        if (received < 0) {            perror("Receive failed");            break;        } else if (received == 0) {            printf("Server closed connection\n");            break;        }        buffer[received] = '\0';        printf("Echo from server: %s\n", buffer);    }    close(sockfd);    printf("Client terminated\n");    return 0;}

下面是执行结果,其中“<x>”是手动加的:服务运行后,停止在<1>处,等待客户端连接;客户端运行后,输入hello,即<2>处;服务端接收到客户端的响应,打印hello,即<3>处;客户端回显服务端的反馈hello,即<4>处;客户端再次发送world,即<5>处;服务端到客户的数据,即<6>处;客户端回显服务端的反馈,即<7>处;客户端退出<8>;服务端退出此客户端的响应进程 <9>。

./serverready for server <1>client data:hello <3>client data:world <6>close client <9>./clinet Connected to server 127.0.0.1:8080Type messages (press Ctrl+D or 'exit' to quit):> hello   <2>Echo from server: hello<4>> world<5>Echo from server: world <7>> exit <8>Client terminated

6总结

多线程虽已占据高性能应用的主流,但 fork 所代表的进程模型依然是操作系统稳定运行的压舱石

作为工程师,我们不应盲目追求线程的高效,而应根据业务对隔离性、稳定性和性能的综合需求,灵活运用“多进程+多线程”的混合架构,这才是构建健壮系统的正道。

其核心价值体现在:

天然的隔离性:为安全沙箱、容器技术提供基础

简单的并发模型:对于IO密集型服务,进程模型更易理解

故障隔离:一个进程崩溃不会影响其他进程

在当代Linux开发中,推荐的使用策略是:

默认使用多线程处理计算密集型或需要紧密协作的任务

在需要强隔离、安全性或简化架构时选择fork+execfork+exec 是执行外部程序的最优解,比直接用 system () 更灵活、更可控(system () 会阻塞父进程,fork+exec 可实现非阻塞执行)

避免在复杂多线程程序中使用fork,除非能完全控制同步状态。多线程中尽量不用 fork;fork 后尽量不要共享文件描述符读写;父子进程的有序执行必须通过同步机制实现,绝不依赖调度顺序。如果必须使用,通过pthread_atfork()注册清理函数

善用“混合架构”,这是现代工业软件的主流架构:主进程负责稳定与隔离,内部多线程负责高性能计算。例如:主进程 fork 出多个 Worker 进程处理不同业务线,每个 Worker 进程内部再启动线程池处理具体任务

使用 fork 必须「三步走」—— ① 判断返回值,区分父子进程;② 子进程执行完业务后必须 exit 退出;③ 父进程必须回收子进程资源,杜绝僵死进程

Linux 应用层的最优并发架构:用fork 做进程级的故障隔离,用线程做进程内的高效并发,二者结合,兼顾性能与稳定性。


最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 16:41:14 HTTP/2.0 GET : https://f.mffb.com.cn/a/463401.html
  2. 运行时间 : 0.409312s [ 吞吐率:2.44req/s ] 内存消耗:4,655.38kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9fb2f8576f2741c325375c70d6c6e057
  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.000639s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000547s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.012721s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.017862s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000808s ]
  6. SELECT * FROM `set` [ RunTime:0.027141s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000757s ]
  8. SELECT * FROM `article` WHERE `id` = 463401 LIMIT 1 [ RunTime:0.135920s ]
  9. UPDATE `article` SET `lasttime` = 1770540074 WHERE `id` = 463401 [ RunTime:0.080688s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.005937s ]
  11. SELECT * FROM `article` WHERE `id` < 463401 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.012498s ]
  12. SELECT * FROM `article` WHERE `id` > 463401 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.012784s ]
  13. SELECT * FROM `article` WHERE `id` < 463401 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006944s ]
  14. SELECT * FROM `article` WHERE `id` < 463401 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.020009s ]
  15. SELECT * FROM `article` WHERE `id` < 463401 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002636s ]
0.410834s