当前位置:首页>java>Java agent探针运用

Java agent探针运用

  • 2026-02-02 14:53:12
Java agent探针运用

作者:苏夏

Java Agent 是 Java 提供的一种在 JVM 启动时或运行时动态修改字节码的强大机制,广泛应用APM 监控(如 SkyWalking、Pinpoint)、热部署(如 JRebel)、代码覆盖率(JaCoCo)、故障注入、安全审计等场景。

Java Agent的两种模式
模式
加载时机
典型用途
Premain Agent
JVM启动时-javaagent)
APM探针、性能监控、字节码增长
Attach Agent
JVM运行时动态attach
线上诊断(如Arthas)、动态开关

核心原理:Instrumentation

Agent 通过java.lang.instrument.Instrumentation接口实现:

  • retransformClasses():重新转换已加载的类(需类支持 retransformation)
  • redefineClasses():直接替换类的字节码(限制多,不常用)
  • addTransformer():注册ClassFileTransformer,在类加载时修改字节码

快速入门:编写一个简单Agent

步骤1:创建Agent入口类:

package com.example;import com.example.transformer.RestTemplateTraceAdvice;import com.example.transformer.TraceAdvice;import com.fasterxml.jackson.databind.ObjectMapper;import net.bytebuddy.agent.builder.AgentBuilder;import net.bytebuddy.asm.Advice;import net.bytebuddy.description.method.MethodDescription;import net.bytebuddy.matcher.ElementMatcher;import java.lang.instrument.Instrumentation;import java.util.Arrays;import java.util.HashSet;import java.util.Set;import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;import static net.bytebuddy.matcher.ElementMatchers.named;import static net.bytebuddy.matcher.ElementMatchers.takesArguments;public class TraceAgent {    private final static String appId ;    private static final Set<StringREQUEST_MAPPING_ANNOTATIONS = new HashSet<>(Arrays.asList(            "org.springframework.web.bind.annotation.RequestMapping",            "org.springframework.web.bind.annotation.GetMapping",            "org.springframework.web.bind.annotation.PostMapping",            "org.springframework.web.bind.annotation.PutMapping",            "org.springframework.web.bind.annotation.DeleteMapping"    ));    private static CustomAgentListener customListener;    static {        appId = System.getProperty("appId");    }    public static void premain(String agentArgs, Instrumentation inst) {        install(inst);    }    public static void agentmain(String agentArgs, Instrumentation inst) {        install(inst);    }    private static void install(Instrumentation inst) {        // 创建自定义监听器,输出到指定文件,只记录指定包的类        customListener = new CustomAgentListener(                "/Users/dsy/code/agent-demo/logs/"+appId+"-bytebuddy-agent.log",  // 日志文件路径                "com.example"               // 只记录 com.example 包下的类        );        new AgentBuilder.Default()                .with(customListener) // 👈 关键:输出匹配详情                .disableClassFormatChanges()                .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)                .with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)                .with(AgentBuilder.TypeStrategy.Default.REDEFINE)                .with(AgentBuilder.DescriptionStrategy.Default.POOL_ONLY// 👈 启用完整类型解析                .type(                        isAnnotatedWith(named("org.springframework.stereotype.Controller"))                                .or(isAnnotatedWith(named("org.springframework.web.bind.annotation.RestController")))                )                .transform((builder, typeDescription, classLoader, module) ->                        builder.visit(Advice.to(TraceAdvice.class)                                .on(anyMethodAnnotatedWithRequestMapping()))//                                builder.method(any()).intercept(MethodDelegation.to(NoOpInterceptor.class))                )                .type(named("org.springframework.web.client.RestTemplate"))                .transform((builder, td, cl, module) ->                        builder.visit(Advice.to(RestTemplateTraceAdvice.class)                                        .on(named("exchange")                                                .and(takesArguments(4))                                                .or(takesArguments(5))                                                .or(takesArguments(6))))                )                .installOn(inst);        System.out.println("[Agent] Controller tracing agent installed.");    }    private static ElementMatcher.Junction<MethodDescriptionanyMethodAnnotatedWithRequestMapping() {        return isAnnotatedWith(named("org.springframework.web.bind.annotation.RequestMapping"))                .or(isAnnotatedWith(named("org.springframework.web.bind.annotation.GetMapping")))                .or(isAnnotatedWith(named("org.springframework.web.bind.annotation.PostMapping")))                .or(isAnnotatedWith(named("org.springframework.web.bind.annotation.PutMapping")))                .or(isAnnotatedWith(named("org.springframework.web.bind.annotation.DeleteMapping")));    }    // 添加关闭方法,用于清理资源    public static void shutdown() {        if (customListener != null) {            customListener.close();        }    }}

步骤2:实现TraceAdvice

package com.example.transformer;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import net.bytebuddy.asm.Advice;import javax.servlet.http.HttpServletRequest;import java.util.Arrays;import java.util.UUID;import static com.example.transformer.TraceContextHolder.PARENT_APP_ID;import static com.example.transformer.TraceContextHolder.X_TRACE_ID;public class TraceAdvice {    public final static String appId ;    public final static ObjectMapper objectMapper;    static {        appId = System.getProperty("appId");        objectMapper = new ObjectMapper();    }    @Advice.OnMethodEnter    public static void enter(@Advice.AllArgumentsObject[] args) {        TraceContextHolder.TraceContext traceContext = TraceContextHolder.traceContext();        // 尝试从参数中提取 HttpServletRequest        HttpServletRequest request = null;        for (Object arg : args) {            if (arg instanceof HttpServletRequest) {                request = (HttpServletRequest) arg;                break;            }        }        String traceId = null;        String parentAppId = null;        if (request != null) {            // 优先从 Header 中获取 traceId(例如:X-Trace-Id)            traceId = request.getHeader(X_TRACE_ID);            parentAppId = request.getHeader(PARENT_APP_ID);        }        if (traceId == null || traceId.trim().isEmpty()) {            // 未传入,则生成新 traceId(建议用 UUID 或 Snowflake)            traceId = "trace-" + UUID.randomUUID().toString().replace("-""").substring(032);        }        if (parentAppId == null || parentAppId.trim().isEmpty()){            parentAppId = "0" ;        }        traceContext.setTraceId(traceId);        traceContext.setArgs(args.toString());        traceContext.setAppId(appId);        traceContext.setParentAppId(parentAppId);        traceContext.setTraceSpanStartTime(System.currentTimeMillis());        // 绑定到当前线程//        TraceContextHolder.setTraceContext(traceContext);        System.err.println(">>> Entering method with args: " + Arrays.toString(args));    }    @Advice.OnMethodExit    public static void exit(@Advice.ReturnObject result) {        TraceContextHolder.TraceContext traceContext = TraceContextHolder.traceContext();        traceContext.setTraceSpanEndTime(System.currentTimeMillis());        try {            traceContext.setResult(objectMapper.writeValueAsString(result));        } catch (JsonProcessingException e) {            throw new RuntimeException(e);        }        System.err.println("<<< Exiting method, returned: " + traceContext.toSting());    }}

步骤3:用于跟踪调用链的上下文

src/main/resources/META-INF/MANIFEST.MF中声明

// com/example/transformer/TraceContextHolder.javapackage com.example.transformer;public class TraceContextHolder {    public final static String X_TRACE_ID = "X-Trace-Id";    public final static String PARENT_APP_ID = "X-Parent-APP-Id";    static String FORMAT = "traceId:%s,parentAppId:%s,appId:%s,traceSpanStartTime:%d,traceSpanEndTime:%d,args:%s,result:%s";    private static final ThreadLocal<TraceContextTRACE = new ThreadLocal<>();    public static void setTraceContext(TraceContext traceContext) {        TRACE.set(traceContext);    }    public static void clear() {        TRACE.remove();    }    public static TraceContext traceContext() {        TraceContext object;        if (TRACE.get() != null) {            object = TRACE.get();        } else {            object = new TraceContext();            TRACE.set(object);        }        return object;    }    public static class TraceContext{        private String traceId;        private String parentAppId;        private String appId;        private Long traceSpanStartTime;        private Long traceSpanEndTime;        private String args;        private String result;        public String getTraceId() {            return traceId;        }        public void setTraceId(String traceId) {            this.traceId = traceId;        }        public String getParentAppId() {            return parentAppId;        }        public void setParentAppId(String parentAppId) {            this.parentAppId = parentAppId;        }        public String getAppId() {            return appId;        }        public void setAppId(String appId) {            this.appId = appId;        }        public Long getTraceSpanStartTime() {            return traceSpanStartTime;        }        public void setTraceSpanStartTime(Long traceSpanStartTime) {            this.traceSpanStartTime = traceSpanStartTime;        }        public Long getTraceSpanEndTime() {            return traceSpanEndTime;        }        public void setTraceSpanEndTime(Long traceSpanEndTime) {            this.traceSpanEndTime = traceSpanEndTime;        }        public String getArgs() {            return args;        }        public void setArgs(String args) {            this.args = args;        }        public String getResult() {            return result;        }        public void setResult(String result) {            this.result = result;        }        public String toSting(){            return String.format(FORMAT,traceId,parentAppId,appId,traceSpanStartTime,traceSpanEndTime,args,result);        }    }}

步骤4:打包&使用

如果用 Maven,可通过maven-jar-plugin自动生成:

<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <groupId>org.example</groupId>        <artifactId>agent-demo</artifactId>        <version>1.0-SNAPSHOT</version>    </parent>    <artifactId>agent3</artifactId>    <properties>        <maven.compiler.source>8</maven.compiler.source>        <maven.compiler.target>8</maven.compiler.target>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <!-- ByteBuddy 核心 -->        <dependency>            <groupId>net.bytebuddy</groupId>            <artifactId>byte-buddy</artifactId>            <version>1.12.10</version>        </dependency>        <dependency>            <groupId>net.bytebuddy</groupId>            <artifactId>byte-buddy-agent</artifactId>            <version>1.12.10</version>        </dependency>        <!-- Spring Web(仅用于类型判断,非强制) -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-web</artifactId>            <version>5.3.31</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>javax.servlet-api</artifactId>            <version>4.0.1</version>            <scope>compile</scope>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>1.7.36</version>            <scope>compile</scope>        </dependency>        <dependency>            <groupId>com.fasterxml.jackson.core</groupId>            <artifactId>jackson-databind</artifactId>            <version>2.17.0</version> <!-- 使用最新稳定版 -->        </dependency>    </dependencies>    <build>        <plugins>            <!-- 使用 shade plugin 打包 fat jar -->            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-shade-plugin</artifactId>                <version>3.5.0</version>                <executions>                    <execution>                        <phase>package</phase>                        <goals>                            <goal>shade</goal>                        </goals>                        <configuration>                            <transformers>                                <transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">                                    <manifestEntries>                                        <Premain-Class>com.example.TraceAgent2</Premain-Class>                                        <Agent-Class>com.example.TraceAgent2</Agent-Class>                                        <Can-Redefine-Classes>true</Can-Redefine-Classes>                                        <Can-Retransform-Classes>true</Can-Retransform-Classes>                                    </manifestEntries>                                </transformer>                            </transformers>                        </configuration>                    </execution>                </executions>            </plugin>        </plugins>    </build></project>

创建两个web应用验证trace到调用生命周期

Web-app

package com.example.demo.conf;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class BeanConfig {    @Bean    public RestTemplate restTemplate() {        return new RestTemplate();    }}
package com.example.demo.controller;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.HttpMethod;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestControllerpublic class HelloController {    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);    @Resource    private RestTemplate restTemplate;    @GetMapping("/hello")    public String hello(@RequestParam(defaultValue = "World") String name) {        logger.info("Processing hello request for: {}", name);        String url = "http://localhost:8081/shopping?commodity=香蕉";        String r = restTemplate.exchange(url, HttpMethod.GET,null,String.class).getBody();        return "Hello, " + name + "!" + " commodity = " + r;    }    @PostMapping("/user")    public String createUser(@RequestBody String userData) {        logger.info("Creating user with data: {}", userData);        return "User created: " + userData;    }    @GetMapping("/error")    public String error() {        logger.info("Triggering error");        throw new RuntimeException("Test exception");    }}

Web-app1

package com.example.demo.controller;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class ShoppController {    private static final Logger logger = LoggerFactory.getLogger(ShoppController.class);    @GetMapping("/shopping")    public String hello(@RequestParam(defaultValue = "苹果") String commodity) {        logger.info("Processing hello request for: {}", commodity);        return "commodity, " + commodity + "!";    }    @PostMapping("/user")    public String createUser(@RequestBody String userData) {        logger.info("Creating user with data: {}", userData);        return "User created: " + userData;    }    @GetMapping("/error")    public String error() {        logger.info("Triggering error");        throw new RuntimeException("Test exception");    }}

从上面可以看到我们在web-app的应用中的hell接口中调用了web-app1的shopping接口,且web-app的接入方式是无代码入侵形式的RestTemplate,主要是依赖agent对asm对增强能实现对trace调用透传

且web-app和web-app1两个进程起来时要通过-javaagent方式将agent的探针无入侵的方式接入应用中。而-DappId是接入的应用id,用于跟踪trace所在的应用和构建应用的拓扑图

验证

触发接口

至此可以通过Agent的探针实现对应用无入侵式,实现调用链的APM 监控、构建应用的拓扑图,并且基于Agent Advice 的增强方式可以进一步实现对中间件的跟踪和观测,如接入DB的观测。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 12:37:34 HTTP/2.0 GET : https://f.mffb.com.cn/a/466407.html
  2. 运行时间 : 0.175312s [ 吞吐率:5.70req/s ] 内存消耗:4,426.04kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0cb03d89f9724e77a396e9560752fadb
  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.000680s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000738s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.005727s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.005010s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000535s ]
  6. SELECT * FROM `set` [ RunTime:0.002258s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000580s ]
  8. SELECT * FROM `article` WHERE `id` = 466407 LIMIT 1 [ RunTime:0.000868s ]
  9. UPDATE `article` SET `lasttime` = 1770525454 WHERE `id` = 466407 [ RunTime:0.002119s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000258s ]
  11. SELECT * FROM `article` WHERE `id` < 466407 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000506s ]
  12. SELECT * FROM `article` WHERE `id` > 466407 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000362s ]
  13. SELECT * FROM `article` WHERE `id` < 466407 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001262s ]
  14. SELECT * FROM `article` WHERE `id` < 466407 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003955s ]
  15. SELECT * FROM `article` WHERE `id` < 466407 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006574s ]
0.176860s