当前位置:首页>python>写给C/Java/Python老兵的Rust快速入门

写给C/Java/Python老兵的Rust快速入门

  • 2026-09-01 07:52:45
写给C/Java/Python老兵的Rust快速入门

装环境:去 rustup.rs 装Rust(一条命令),或者嫌麻烦直接打开 play.rust-lang.org 在线跑。代码片段默认省略了fn main外壳,粘贴时包一层即可。

本文适合精通C、Java、Python的资深程序员。你既有C的底层内存视角,又懂Java/Python的高级抽象——理解Rust的关键,就是把思维从「手动管理内存」或「依赖垃圾回收器」切换到第三条路:编译期所有权检查。


为什么Rust非要搞一套所有权?

先看Rust在解决什么痛点:

  • • C语言:你有绝对控制权(malloc/free),但代价是极易出现内存泄漏、悬垂指针(Dangling Pointer)、重复释放(Double Free),以及多线程下的数据竞争(Data Race)。
  • • Java/Python:你不用管内存,GC在后台帮你清理,代价是运行时性能损耗和GC停顿。

Rust的解法:既不要GC,也不要手动free 它通过一套静态规则(所有权机制),在编译阶段就决定内存何时分配、何时释放。你的代码可能导致内存不安全?编译器直接拒绝编译。

一句话:Rust把你在C里运行时才崩的事故,全部提前到编译期变成语法错误。


一、所有权的三大黄金法则

  1. 1. Rust中每一个值都有一个对应的变量,这个变量是该值的所有者(Owner)
  2. 2. 在任何时刻,一个值只能有一个所有者。
  3. 3. 当所有者离开**作用域(Scope)**时,该值被自动丢弃(调用drop释放内存,类似C++的RAII)。

这和C语言栈变量的生命周期很像:

{lets = String::from("hello"); // s成为字符串的所有者,内存在堆上分配// ... 可以使用s// 作用域结束,Rust自动调用drop释放堆内存,完全不需要手动free

转移(Move):颠覆你习惯的赋值操作

这是Rust最容易卡住新人的地方:

lets1 = String::from("hello");lets2 = s1;println!("{}", s1); // 编译报错!
  • • Python/Java里s1s2指向堆上同一个对象(引用拷贝)。
  • • C里:这是浅拷贝(拷贝指针),不小心free两次就Crash。
  • • Rust里:为了保证「只能有一个所有者」和「避免二次释放」,let s2 = s1;发生时,所有权**转移(Move)**给了s2,编译器禁止再使用s1

补充一个关键点:Move不只发生在StringVec这类堆数据上——任何没实现Copy特征(Trait)的类型,赋值都是Move,包括纯栈上的自定义struct。只是因为堆类型最常见,新手才误以为只有堆数据会Move。栈上的基础类型(整数、浮点、布尔、字符)实现了Copy,赋值是按位复制,和C一模一样,a继续可用。

给Python老兵一个桥:你早就熟悉「值的一生」——Python的引用计数是运行时逐对象计数,Rust把它提前到编译期,用静态所有权替代,把共享引用换成Move。

借用(Borrowing):不想交所有权怎么办?

如果每次传参都要交出所有权,代码根本没法写。Rust提供引用(Reference),也叫借用(Borrowing)——使用值,但不获取所有权:

lets1 = String::from("hello");letfirst = first_word(&s1); // 传递引用(借用),不交出所有权println!("{}", s1); // s1仍然可用!fnfirst_word(s: &String-> &str {    s.as_str() // 返回借用视图,不拥有背后的内存// s离开作用域,但因为没有所有权,不会释放内存

(注:first_word返回的&str没写生命周期标注——这是编译器帮你省略了,第八章展开讲。)

借用的规则本质上是编译期强制执行的读写锁:

  1. 1. 可以有无数个不可变引用&T)——像读锁,大家都能读,都不能改。
  2. 2. 或者只能有一个可变引用&mut T)——像写锁,排他性。
  3. 3. 两者不能同时存在。
letmut s = String::from("hello");letr1 = &s; // OK,不可变借用letr2 = &s; // OK,可以有多个// let r3 = &mut s; // 编译报错!已有不可变借用,不能再有可变借用println!("{} and {}", r1, r2);

这条规则从根上消灭了数据竞争。你尝试两个线程同时改一块内存,或者在遍历集合时修改集合(Java里是ConcurrentModificationException,C里是段错误),Rust在编译时就拦下你。

顺带搞懂String vs &str

C老兵脑子里只有char*一种字符串,Rust里有两个,这是必踩的坑:

  • • String拥有所有权的堆字符串,类似malloc出来的buffer,自己负责释放。
  • • &str借用视图,类似const char*,只读不拥有。
letownedString = String::from("hello"); // 堆上的主人letview: &str = &owned;                   // 借用视图,类似const char*

函数参数尽量用&str,就像C里传const char*比传char*更通用。


二、变量与类型速览

所有权和借用是Rust的安全骨架,接下来10分钟把变量、类型、表达式这些肌肉过一遍。

默认「冻结」的变量

C、Java、Python里变量默认可变,Rust默认不可变

letx = 5;// x = 6; // 编译报错!相当于Java的final或C的constletmut y = 5// 显式声明mut才相当于普通变量y = 6;         // 成功

Shadowing(隐藏):允许在同一个作用域用let重新声明同名变量,类型转换时非常好用,省去age_strage_int这种命名烦恼:

letspaces = "   ";            // 字符串类型letspaces = spaces.len();     // 重新声明,变成整型,旧的被隐藏

引用(&)与解引用(*):聪明的C指针

Rust用&取地址(借用)、*解引用,语法长得像C,但它是被套上枷锁的指针——编译器在编译期盯着,确保永远不会变成空指针或悬垂指针。引用和C指针的本质区别,第三章展开。

Rust有个贴心语法糖:调用方法时自动帮你解引用,你永远只写.,不用像C/C++那样区分.->

类型速查表

Rust
C对标
Java对标
说明
i32intint
默认整型
u8uint8_tbyte
(有符号)
常用来表示字节;注意Java的byte是-128127,u8是0255,不直接对应
usizesize_t
-
与CPU字长一致,内存地址的大小
f64doubledouble
默认浮点
charchar
(1字节)
char
(2字节)
Rust的char是4字节,支持emoji
Stringchar*
 + 手动free
String
拥有所有权的堆字符串
&strconst char*
-
字符串借用视图
Vec<T>
手写动态数组
ArrayList<T>
动态扩容数组
[T; N]int arr[N]
数组
固定长度,栈上
(i32, f64)
-
-
元组,固定长度异构

Rust有强大的类型推导,不用每次写类型;字面量可以用后缀直接指定类型:

leta = 10;        // 默认推导i32lete = 10u8;      // 字面量后缀:10且类型是u8letf = 3.14f32;   // 浮点后缀letg = 1_000_000// 数值分隔符,等价于1000000

表达式优先:抛弃return关键字

Rust是基于表达式的语言。代码块几乎都能返回值,规则只有一条:最后一行没有分号;,它就是返回值。

// if是表达式,可以直接赋值(取代C的三元运算符)letnumber = if condition { 5 } else { 6 };// 函数返回值也不用写returnfnadd(a: i32, b: i32->i32 {    a + b // 没有分号,它就是返回值;加了分号就变成返回空单元(),和声明的`-> i32`不匹配而报错}

三、指针体系全景:引用、裸指针、智能指针

C里只有「指针」一种东西,Rust为了区分「受编译器安全检查的指针」和「不受检查的纯C指针」,拆成了两大类。

安全引用(日常主力)

概念
写法
类型
C对标
不可变引用
let r = &x;&Tconst T *r
可变引用
let r = &mut x;&mut TT *r
解引用
*r = 10;
-
*r = 10

运行时就是内存地址,和C指针毫无性能差异;编译期受读写锁规则限制,不允许指针运算(p + 1),永远不为空

裸指针(FFI和unsafe专用)

真正的C指针:允许为空、允许悬垂、允许指针运算。创建裸指针是安全的,但解引用必须包在unsafe块里——相当于告诉编译器:「别查了,我是老司机,出了段错误我自己背锅。」

letarr = [10i322030];       // 栈上数组,连续内存letp: *consti32 = arr.as_ptr(); // 不可变裸指针unsafe {letnext = p.offset(1);      // 指向20,指针偏移用方法不用加减号println!("{}", *next);}

和C不同,Rust在安全引用上完全禁止指针运算(p + 1编译不过);裸指针上+/-虽然可用(底层数学逻辑和C完全一致,偏移量自动乘以sizeof(T)),但官方更推荐.add()/.sub()/.offset()方法——更显式,明确告知读者「我在做不安全的指针算术」。

智能指针:堆内存的管家

Box<T>Rc<T>Arc<T>是C++11智能指针思想的Rust版,核心原理相同:用栈管理堆——一个分配在栈上的结构体包裹着堆指针,离开作用域时自动触发析构(Rust里叫Drop),替你执行free。你既得到Java式「自动清理」的体验,又不需要任何后台GC线程。

Rust
C++11对标
语义
Box<T>unique_ptr
独占堆内存,相当于malloc+free,零开销
Rc<T>shared_ptr
单线程引用计数,计数归零才释放
Arc<T>shared_ptr
(原子版)
多线程安全的引用计数,用原子操作
Weak<T>weak_ptr
不增加计数,打破循环引用

为什么C++已经有了,Rust还要再造一遍? 因为C++只是把它做成了标准库——你依然可以手写野指针,或者把unique_ptr里的裸指针掏出来乱用,编译器顶多警告,运行时照样Crash。而Rust把这套逻辑做进了编译器层面,所有权转移、借用生命周期强制检查,写得不安全直接拒绝编译。

用一句话总结:Rust是强制你以C++宗师级最佳实践来写代码的编译器。


四、没有null、没有异常

这是Rust在工程实践中最受好评的设计。

  • • C的痛点:函数返回NULL-1代表错误,忘了检查就段错误。
  • • Java的痛点:十亿美金的错误NullPointerException,和臃肿的try-catch嵌套。

Rust语言里根本没有null关键字,也没有Exception。它用两个标准库枚举替代:

  • • Option<T>Some(T)/None,替代null。想直接当普通对象用?编译器拦住你,从根源杜绝空指针。
  • • Result<T, E>Ok(T)/Err(E),替代异常。成功还是失败,写代码时就强迫你直面。

杀手级语法糖?:一行代码完成错误向上传递,替代C里满屏的if (err != 0) return err;

use std::fs::File;use std::io::Read;fnread_file_content() ->Result<String, std::io::Error> {letmut f = File::open("hello.txt")?; // 成功就取出file,失败直接return Err给调用者letmut s = String::new();    f.read_to_string(&mut s)?;Ok(s)}

顺带认识():它就是Rust的void。Rust讨厌特例,认为「没有返回值」也应该是一个正经的值(大小0字节)。所以泛型想表达「无返回值」时,直接传()进去,逻辑完美闭环。


五、Enum + match + Trait

携带数据的Enum

C的枚举只是一组具名整数(Java的枚举其实是完整的类,这里不展开)。Rust的Enum每个变体可以包裹完全不同的数据结构(代数数据类型ADT):

enumWebEvent {    PageLoad,                 // 不带数据,类似传统C enumKeyPress(char),           // 包裹一个字符    Click { x: i64, y: i64 }, // 包裹一个匿名结构体Write(String),            // 包裹一个堆分配的字符串}

怎么解析?用matchmatch是Rust的switch终极版:能匹配值、直接解构提取内部数据,而且编译器强制穷举——漏写一种情况直接拒绝编译。

特征(Trait):接口的替代品

Rust没有classextends,秉承「数据与行为分离」的哲学:Struct定义有什么数据,Trait定义有什么能力(类似Java的Interface)。最牛的是,你可以为任何类型实现Trait,甚至语言内置的基础类型

traitSummary {fnsummarize(&self->String;}structArticle { title: String, content: String }implSummaryforArticle {fnsummarize(&self->String { format!("标题: {}"self.title) }}implSummaryfori32 { // 给原生整数实现特征(Trait),这在Java里绝不可能fnsummarize(&self->String { format!("我是一个数字: {}"self) }}

丢掉笨重的继承树,用乐高积木一样的组合赋予类型各种能力。


六、无畏并发:编译器教你写多线程

Rust的核心理念:数据竞争本质是内存读写问题,把所有权和读写锁规则应用到多线程,数据竞争可以在编译期彻底消灭。

Send和Sync:编译期线程安全

标准库里有两个特殊的特征,没有方法,只给编译器「打标」:

  • • Send:所有权可以安全地跨线程转移。
  • • Sync:可以在多线程间安全地共享引用。

精妙之处在于:单线程引用计数Rc<T>的计数器不是原子的,标准库没有为它实现Send。你不小心把Rc放进thread::spawn?编译器直接拒收,告诉你必须换成原子操作的Arc<T>。这种编译期线程安全检查,是C和Java梦寐以求的。

Mutex:数据被锁包裹

C(pthreads)和Java里,锁和数据是分离的,你完全可以忘了加锁直接改数据。Rust的Mutex是个容器——你必须把数据塞进锁里,不加锁连数据的面都见不到:

use std::sync::{Arc, Mutex};use std::thread;letcounter = Arc::new(Mutex::new(0));letmut handles = vec![];for_in0..10 {letcounter_clone = Arc::clone(&counter);    handles.push(thread::spawn(move || {letmut num = counter_clone.lock().unwrap(); // 必须lock才能拿到数据        *num += 1;// num离开作用域,锁自动释放——绝不会忘了unlock(死锁仍可能,比如同一线程重复加锁)    }));}forhin handles { h.join().unwrap(); }println!("Result: {}", *counter.lock().unwrap()); // 必然是10

move闭包:多线程传参的关键

thread::spawn(move || { ... })里的move是关键。默认闭包对外部变量是借用(引用捕获),但新线程可能比当前函数活得更久——主函数结束了,栈被回收,子线程还在跑,就成了悬垂指针(想想C里把局部变量指针传给pthread_create的后果)。move告诉编译器:「把闭包用到的所有外部变量的所有权,打包强行转移进新线程。」配合Arc::clone制造的智能指针分身,编译器在编译期就完成了C语言必须靠极其严谨的程序员才能做到的事。


七、宏:编译期魔法

看到名字带感叹号!vec!println!)的就是宏。C的#define是纯文本替换,Rust的宏操作抽象语法树(AST),类型安全且卫生(不会意外污染外部变量)。

println!会在编译期检查格式化字符串——参数数量和类型不匹配直接编译失败,比C的printf(类型错了运行时才乱码)安全得多。{}是面向用户的Display格式,{:?}是面向开发者的Debug格式(Vec这类复杂结构用{:?}打印)。

过程宏是编译期间运行的Rust插件程序,相当于Java注解+Lombok,但完全在编译期完成,运行时零开销:

  • • #[derive(Debug, Clone)]:派生宏,自动生成样板代码,一行顶几十行。
  • • #[tokio::main]#[get("/users/<id>")]:属性宏,类似Java/Python装饰器,Web后端和异步代码里满屏都是。
  • • sqlx::query!("SELECT * FROM users"):函数式宏,编译时真的连数据库,SQL写错了直接编译失败——MyBatis里字段名拼错要等运行时才报错。

八、生命周期:那个吓人的<'a>

回扣第一章的伏笔:为什么first_word返回引用不用写生命周期?因为Rust有一条省略规则:当函数只有一个输入引用时,输出引用的生命周期自动和它绑定,编译器能自己推断,不需要你写。

但有一种情况编译器「瞎了」:多个输入引用,返回其中一个。它只看函数签名——返回的&str到底指向x还是y?不告诉我,我怎么做安全检查?

// 编译报错!缺少生命周期标识fnlongest(x: &str, y: &str-> &str {if x.len() > y.len() { x } else { y }}

解法是生命周期泛型<'a>——'a是x、y、返回值共用的生命周期参数,编译器实际取x和y中较短的那个作为有效范围:

fnlongest<'a>(x: &'astr, y: &'astr-> &'astr {if x.len() > y.len() { x } else { y }}

关键澄清:加<'a>绝不是延长变量寿命,它只是一个契约声明,协助编译器做数学证明。

什么情况需要手写?两种:函数返回引用(且有多输入)、结构体里放引用(struct User<'a> { name: &'a str })。另外'static代表整个程序运行期,字符串字面量就是&'static str

为什么新手一用就痛不欲生? 生命周期有「病毒式传染性」:把&'a str放进User<'a>,再把User<'a>放进TeamTeam也得带上<'a>……代码里长满杂草。所以资深开发者的最佳实践是:多用所有权,少用引用——结构体里放String而不是&str,放Vec<T>而不是&[T],大不了.clone(),用极小的内存拷贝开销换取代码整洁和开发效率。只有写零拷贝解析器(比如JSON序列化库)这种性能苛刻的核心路径,才去秀生命周期控制。


九、老兵转Rust的三大「保命」实践

  1. 1. 不要过早优化:该Clone就Clone。 C老兵的通病是到处传引用,给所有结构体加生命周期注解,最后代码像乱码。最初写逻辑时所有权冲突直接.clone()或套Arc——99%的业务逻辑里克隆成本微乎其微。功能跑通、性能真成瓶颈了,再回来重构为引用。
  2. 2. 忘记面向对象:多用组合。 Rust没有继承,把公共数据抽成独立Struct塞进别的Struct里,把公共行为抽象成Trait,用Enum处理分支。
  3. 3. 把Clippy当成严师。 高频运行cargo clippy(官方Linter)。它不只告诉你哪里错了,更教你怎么写地道——你写了个啰嗦的match,它会提示「这里其实可以用unwrap_or_default()」。跟着Clippy写一个月,代码就带上大师味。

十、实战验收:并发请求多个网页

把前面所有知识合起来——宏、所有权、move闭包、错误处理,加上工业界两个权威生态库tokio(异步运行时,类似Netty+Goroutine)和reqwest(HTTP客户端,用法像Python requests):

# Cargo.toml[dependencies]reqwest = { version = "0.12", features = ["json"] }tokio = { version = "1.0", features = ["full"] }
use reqwest::Client;use std::time::Instant;// 过程宏:把普通main变成支持async/await的多线程并发入口#[tokio::main]asyncfnmain() ->Result<(), Box<dyn std::error::Error>> {leturls = vec!["https://www.rust-lang.org","https://github.com","https://www.google.com","https://this-fake-url-will-fail.com"// 测试错误处理    ];letclient = Client::new(); // 内部用Arc包装连接池,clone成本只是计数+1letmut handles = vec![];lettotal_start = Instant::now();forurlin urls {letclient_clone = client.clone();leturl_string = url.to_string();// async move强迫闭包夺走client_clone和url_string的所有权lethandle = tokio::spawn(asyncmove {letstart = Instant::now();// send()返回Result,match强制处理成功和失败两种情况match client_clone.get(&url_string).send().await {Ok(response) => println!("✅ 成功: [{}] 状态码: {}, 耗时: {:?}",                    url_string, response.status(), start.elapsed()                ),Err(e) => println!("❌ 失败: [{}] 耗时: {:?} | 报错: {}",                    url_string, start.elapsed(), e                ),            }        });        handles.push(handle);    }forhandlein handles {        handle.await?; // 协程内部panic时,?把错误返回给main    }println!("🎉 所有请求完成!总耗时: {:?}", total_start.elapsed());Ok(())}

这段代码为什么体现Rust的「工业级美感」?

  1. 1. 没有回调地狱、没有锁:全异步并发,但代码像同步一样清爽(得益于async/await)。
  2. 2. 极端安全:忘了加move或直接传&strtokio::spawn,编译器大声报错——编译期就排除了悬垂指针。
  3. 3. 隐形性能:四个请求在底层epoll/kqueue上并发执行,根本不会创建四个系统级线程,这就是无栈协程的威力。
  4. 4. 错误可见性:Java的异常不可见,Rust的Result强迫你在写代码的当下直面「这个请求会失败」的事实。

写在最后

Rust把你在C里运行时会遇到的段错误、数据竞争,以及在Java里庞大的GC停顿和空指针异常,全部转化成了编译期的语法错误。前期确实有「和编译器搏斗」的痛苦,但一旦编译通过,那种「内存安全层面跑起来就绝对不会崩,且速度极快」的安心感,是其他语言给不了的。

这也是Rust社区那句名言的底气:"If it compiles, it works." ——只要编译通过,运行期的内存安全就有编译期保证。

你的C/Java/Python功底就是最大的优势。下一步:官方Rust Book(doc.rust-lang.org/book)系统过一遍,配合Rustlings(github.com/rust-lang/rustlings)刷练习——让编译器(和Clippy)做你的私人教练。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-09-01 17:45:41 HTTP/2.0 GET : https://f.mffb.com.cn/a/512377.html
  2. 运行时间 : 0.087788s [ 吞吐率:11.39req/s ] 内存消耗:5,057.89kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5698f1444764d8a1bcccc4de3ac122b9
  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.000840s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000982s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000305s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000266s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000519s ]
  6. SELECT * FROM `set` [ RunTime:0.000264s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000563s ]
  8. SELECT * FROM `article` WHERE `id` = 512377 LIMIT 1 [ RunTime:0.000820s ]
  9. UPDATE `article` SET `lasttime` = 1788255942 WHERE `id` = 512377 [ RunTime:0.004008s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000245s ]
  11. SELECT * FROM `article` WHERE `id` < 512377 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000545s ]
  12. SELECT * FROM `article` WHERE `id` > 512377 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000438s ]
  13. SELECT * FROM `article` WHERE `id` < 512377 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001716s ]
  14. SELECT * FROM `article` WHERE `id` < 512377 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004680s ]
  15. SELECT * FROM `article` WHERE `id` < 512377 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000974s ]
0.089430s