当前位置:首页>php>PHP 8.5 管道操作符 (|>) 告别嵌套函数地狱,写出清晰的数据管道

PHP 8.5 管道操作符 (|>) 告别嵌套函数地狱,写出清晰的数据管道

  • 2026-01-23 00:17:42
PHP 8.5 管道操作符 (|>) 告别嵌套函数地狱,写出清晰的数据管道

PHP 8.5 管道操作符 (|>) 告别嵌套函数地狱,写出清晰的数据管道

现在是一月初,感觉该带点新东西回来了。PHP 8.5 来了,虽然改进不少,但有个功能对日常可读性特别突出:管道操作符 (|>)。

可以把它想成"让我的转换变可读"按钮。它让你从左到右写数据处理步骤,不用把它们埋在嵌套括号里。如果你写过(或继承过)foo(bar(baz(trim($x)))) 这种代码,你已经知道为什么这很重要了。

下面用实际例子拆解——字符串、数组、错误处理——最后给个简单的重构清单,让你能安全地采用它。

原文 PHP 8.5 管道操作符 (|>) 告别嵌套函数地狱,写出清晰的数据管道[1]

日常问题:嵌套调用 vs 顺序步骤

写过一段时间 PHP,你可能见过这种代码:

1

$result = foo(bar(baz(trim(strtolower($input)))));

能跑。但也是那种让你在 review 时停下来、眯眼、默默从里往外重新解析括号的代码——像在做脑力体操。

PHP 开发者历史上有两种常见处理方式:

  • • 嵌套函数调用(长了就难读)
  • • 逐步临时变量(更清晰,但有时啰嗦)

PHP 8.5 引入第三种选择:管道操作符 (|>),让你从左到右写转换,跟你口头解释逻辑的方式一样。

不再是"取输入,小写,trim,验证……"埋在括号里,你可以写:

1
2
3
4

$email = $input    |> trim(...)    |> strtolower(...)    |> (fn ($v) => /* validate */ $v);

这篇文章是管道操作符的实战教程——不会把你的代码库变成时髦但难读的"函数式汤"。

概括地说,管道操作符把左边的值传给右边的单参数 callable,产出 callable 的返回值。

核心概念:把前一个结果喂给下一个 callable

PHP 8.5 里,管道操作符这样求值:

1

$result = $value |> someCallable(...);

逻辑上等于:

1

$result = someCallable($value);

链式调用才是它有用的地方:

1
2
3
4

$result = $value    |> firstStep(...)    |> secondStep(...)    |> thirdStep(...);

每个阶段接收上一阶段的输出。

右边什么算 callable?

右边可以是任何接受一个参数的 callable,包括:

  • • 一等公民 callable 如 trim(...)strlen(...)
  • • 闭包/箭头函数如 (fn ($x) => ...)
  • • 可调用对象(__invoke()
  • • 实例方法 callable 如 $obj->method(...)
  • • 静态方法 callable 如 ClassName::method(...)

关键规则:一个输入值流过去。

PHP 手册明确指出右边的 callable 必须接受单个参数,多于一个必需参数的函数直接用不了。

这个规则决定了你实际怎么写管道。后面会看到处理"多参数"函数的模式。

基础管道:字符串 → trim → 小写 → 验证

来构建一个能直接放进项目的东西:一个小的邮箱规范化管道,同时验证并在失败时报错。

规范化

1
2
3
4
5
6
7
8

<?phpdeclare(strict_types=1);$rawEmail = "  Alice.Example+promo@GMAIL.com  ";$normalized = $rawEmail    |> trim(...)    |> strtolower(...);echo $normalized;// "alice.example+promo@gmail.com"

目前看起来像方法链——但它作用于普通字符串,不是对象。

验证(无效时停止管道)

filter_var() 是个好例子,因为验证不只是另一个"转换"。它可能失败。

而且 filter_var($value, FILTER_VALIDATE_EMAIL) 需要第二个参数才有意义。管道只传一个参数,所以要包装一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<?phpdeclare(strict_types=1);function validateEmail(string $email): string{    // filter_var 返回过滤后的值或 false    $validated = filter_var($email, FILTER_VALIDATE_EMAIL);    if ($validated === false) {        throw new InvalidArgumentException("Invalid email: {$email}");    }    return $validated;}$rawEmail = "  alice@example.com  ";$email = $rawEmail    |> trim(...)    |> strtolower(...)    |> validateEmail(...);echo $email;

读起来很顺:trim → 小写 → 验证。

单行验证阶段(throw 作为表达式)

如果你喜欢更紧凑的管道,PHP 的 throw 是表达式(PHP 8.0 起),可以这样:

1
2
3
4
5
6
7
8
9
10

<?phpdeclare(strict_types=1);$rawEmail = "  alice@example.com  ";$email = $rawEmail    |> trim(...)    |> strtolower(...)    |> (fn (string $v) => filter_var($v, FILTER_VALIDATE_EMAIL)        ?: throw new InvalidArgumentException("Invalid email: {$v}")    );echo $email;

一个小但重要的语法注意点:

在 |> 右边用箭头函数时,必须用括号包起来,避免解析歧义。

所以这是必须的:

1

$value |> (fn ($x) => doSomething($x));

不是:

1
2

// ❌ 这会解析失败$value |>fn ($x) => doSomething($x);

让它"真实":规范化 Gmail 地址

加个实际的转换:对于 Gmail 地址,本地部分的点被忽略,+tag 也被忽略。很多系统会规范化这些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

<?phpdeclare(strict_types=1);function canonicalizeGmail(string $email): string{    [$local, $domain] = explode('@', $email, 2);    if ($domain !== 'gmail.com' && $domain !== 'googlemail.com') {        return $email;    }    // 移除 plus tag    $local = explode('+', $local, 2)[0];    // 移除点    $local = str_replace('.', '', $local);    return $local . '@gmail.com';}$rawEmail = "  Alice.Example+promo@GMAIL.com  ";$email = $rawEmail    |> trim(...)    |> strtolower(...)    |> (fn (string $v) => filter_var($v, FILTER_VALIDATE_EMAIL)        ?: throw new InvalidArgumentException("Invalid email: {$v}")    )    |> canonicalizeGmail(...);echo $email;// "aliceexample@gmail.com"

这就是 |> 开始发光的地方:加步骤时管道保持可读。

数组和集合的管道:map / filter / reduce(真实用例)

字符串简单。数组是很多 PHP 代码库开始变乱的地方——因为标准库很强大,但函数签名经常不太适合管道化。

来个常见任务:处理原始订单数据,计算"已支付"订单的收入。

假设你读了 JSON,得到这样的数组:

1
2
3
4
5

$orders = [    ['id' => 1, 'status' => 'paid',   'total' => 120.50],    ['id' => 2, 'status' => 'failed', 'total' =>  80.00],    ['id' => 3, 'status' => 'paid',   'total' =>  42.25],];

目标:用清晰的管道求已支付订单的 total 之和。

保持管道干净的辅助函数

array_filterarray_map 和 array_reduce 很好用,但不包装一下没法干净地接受单个"管道值"。

一个实用模式是创建小辅助函数,返回单参数 callable。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

<?phpdeclare(strict_types=1);function map(callable $fn): Closure{    returnfn (array $items): array => array_map($fn, $items);}function filter(callable $fn): Closure{    returnfn (array $items): array => array_filter($items, $fn);}function reduce(callable $fn, mixed $initial): Closure{    returnfn (array $items): mixed => array_reduce($items, $fn, $initial);}

现在可以顺畅地管道数组了。

已支付收入管道

1
2
3
4
5
6
7
8
9
10
11
12

<?phpdeclare(strict_types=1);$orders = [    ['id' => 1, 'status' => 'paid',   'total' => 120.50],    ['id' => 2, 'status' => 'failed', 'total' =>  80.00],    ['id' => 3, 'status' => 'paid',   'total' =>  42.25],];$paidRevenue = $orders    |> filter(fn (array $o) => $o['status'] === 'paid')    |> map(fn (array $o) => (float) $o['total'])    |> reduce(fn (float $sum, float $t) => $sum + $t, 0.0);echo $paidRevenue; // 162.75

像英语一样读:

  • • 过滤已支付订单
  • • 映射到 total
  • • 归约成总和

稍微丰富的真实例子:CSV 风格的行转干净记录

假设你有一组行:

1
2
3
4
5
6

$lines = [    " alice@example.com , paid ",    " bob@invalid-domain , paid ",    " charlie@example.com , failed ",    "  dora@example.com, paid ",];

目标:

  • • 解析成 [email, status]
  • • 规范化邮箱
  • • 验证邮箱(丢弃无效的)
  • • 只保留已支付
  • • 返回规范化邮箱列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

<?phpdeclare(strict_types=1);function normalizeEmail(string $email): string{    return trim(strtolower($email));}function isValidEmail(string $email): bool{    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;}$lines = [    " alice@example.com , paid ",    " bob@invalid-domain , paid ",    " charlie@example.com , failed ",    "  dora@example.com, paid ",];$paidEmails = $lines    |> map(fn (string $line) => array_map('trim', explode(',', $line)))    |> map(fn (array $parts) => ['email' => normalizeEmail($parts[0]), 'status' => $parts[1]])    |> filter(fn (array $r) => isValidEmail($r['email']))    |> filter(fn (array $r) => $r['status'] === 'paid')    |> map(fn (array $r) => $r['email'])    |> (fn (array $arr) => array_values($arr));print_r($paidEmails);// ['alice@example.com', 'dora@example.com']

注意:

  • • 每个阶段是一个转换
  • • 验证在管道里,但不用 normalizeEmail(...) 因为它可能抛异常
  • • array_filter 保留键,所以最后 array_values() 是常见的清理步骤

这种转换管道就是 |> 发挥价值的地方。

管道 + 错误处理:try/catch vs 守卫子句

管道是表达式。错误处理是很多团队要么喜欢要么讨厌这种风格的地方。

有两种健康的方式:

选项 A:管道外的守卫子句(无聊但很清晰)

这是"别耍聪明"的方式:

1
2
3
4
5
6
7
8
9
10
11

<?phpdeclare(strict_types=1);$email = $rawEmail    |> trim(...)    |> strtolower(...);if ($email === '') {    throw new InvalidArgumentException('Email is required.');}if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {    throw new InvalidArgumentException('Email is invalid.');}

优点:

  • • 非常明确
  • • 容易调试
  • • 闭包里没有异常技巧

缺点:

  • • "故事"被拆成管道 + 单独的验证块

选项 B:管道里抛异常,外面 catch(适合"全有或全无")

当管道逻辑上是一个操作——"解析并规范化这个输入,否则失败"——整个包起来可以很干净:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

<?phpdeclare(strict_types=1);try {    $email = $rawEmail        |> trim(...)        |> strtolower(...)        |> (fn (string $v) => $v !== ''            ? $v            : throw new InvalidArgumentException('Email is required.')        )        |> (fn (string $v) => filter_var($v, FILTER_VALIDATE_EMAIL)            ?: throw new InvalidArgumentException('Email is invalid.')        );    // 使用 $email} catch (InvalidArgumentException $e) {    // 处理验证错误}

优点:

  • • 管道读起来像单个"事务"
  • • 适合请求解析/DTO 构建

缺点:

  • • 过度使用会让人觉得异常被当作控制流

调试友好的模式:inspect()(管道的"tap")

管道代码的一个批评是"中间值更难调试"。

你可以插入一个阶段来记录并原样返回值,不用放弃管道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

<?phpdeclare(strict_types=1);function inspect(callable $fn): Closure{    returnfunction (mixed $value) use ($fn{        $fn($value);        return $value;    };}$result = $rawEmail    |> trim(...)    |> inspect(fn ($v) => error_log("After trim: " . $v))    |> strtolower(...)    |> inspect(fn ($v) => error_log("After lower: " . $v));

这保持了从左到右的流,同时让中间状态在调试时可见。

与函数和方法的互操作:写出保持可读的管道

管道操作符很简单;艺术在于用它而不让代码看起来像聪明的谜题。

签名匹配时优先用一等公民 callable

如果函数已经接受单个必需参数,这是最干净的形式:

1

$value |> trim(...) |> strtolower(...);

因为 trim(...) 是 callable 引用,不是调用。它是"一个你可以传递的函数"。

用命名函数表达"业务含义"

如果一个阶段不明显,给它起个名字。

不要:

1

$data |> (fn ($x) => /* 12 行逻辑 */);

要:

1

$data |> normalizeCustomerPayload(...);

管道应该读起来像高层脚本。

管道到方法(实例和静态)

如果你有个 mapper 对象:

1
2
3
4
5
6
7
8
9
10
11
12

<?phpdeclare(strict_types=1);finalclass UserMapper{    publicfunction toDto(array $row): UserDto    {        // ...    }}$mapper = new UserMapper();$dto = $row    |> $mapper->toDto(...);

或静态方法:

1

$dto = $row |> UserMapper::fromRow(...);

处理需要额外参数的函数

记住:管道传一个参数。很多 PHP 标准函数要更多。

例子:explode('.', $value) 需要两个必需参数,所以不能这样:

1
2

// ❌ explode 需要 2 个参数;这直接不行$parts = $domain |> explode(...);

包装一下:

1

$parts = $domain |> (fn (string $v) => explode('.', $v));

或者,如果你喜欢,创建一个小辅助函数来"预配置"函数:

1
2
3
4
5
6

function explodeBy(string $delimiter): Closure{    returnfn (string $value): array => explode($delimiter, $value);}$parts = $domain |> explodeBy('.');

这种"配置好的 callable"方式在真实代码里扩展性很好。

操作符优先级陷阱(用括号保持无聊)

RFC 和手册指出 |> 有定义的优先级且是左结合的。实际上,跟 ??、三元运算符或更复杂的表达式混用时应该用括号,除非明显安全。

例子:先选 callable,再管道进去:

1
2

$fn = $flag ? enabledFunc(...) : disabledFunc(...);$result = $value |> $fn;

如果你坚持内联,用括号:

1

$result = $value |> ($flag ? enabledFunc(...) : disabledFunc(...));

另一个尖锐边缘:引用传递的 callable 不允许

有些 PHP 函数按引用接受参数。管道操作符不允许管道到需要引用传递参数的 callable。

大多数日常管道不需要引用——但知道为什么有些函数在管道里不工作是好的。

什么时候不该用 |>(是的,这是真事)

管道操作符是工具,不是宗教。这些情况通常是错误选择。

需要大量分支逻辑时

如果你的转换有多个提前退出、复杂条件和嵌套循环,管道会变得勉强。

干净的 if/else 块通常比把所有东西塞进闭包好。

副作用是主要目的时

管道在每个阶段是纯转换时最好:输入 → 输出。

如果目的是"发邮件"、"写数据库"、"发布事件",你仍然可以管道,但容易在链里隐藏重要副作用,让流程更难理解。

如果确实需要副作用,优先用明确的 inspect() 阶段,让发生的事情清晰。

管道变成"闭包汤"时

如果每隔一个阶段是:

1

|> (fn ($x) => someFunc($x, $a, $b, $c))

你可能在跟 PHP 的函数签名较劲太多。

这时候:

  • • 提取命名辅助函数
  • • 或用直接的顺序代码

调试是主要活动时

管道可以调试,但如果你在事故响应的热循环里,临时变量仍然是你的朋友。

可读代码是你能快速插桩和检查的代码。

链太长时

经验法则:如果管道超过 6-10 个阶段,考虑把阶段分组成命名函数。

不要:

1
2
3
4
5
6
7
8

$payload    |> step1(...)    |> step2(...)    |> step3(...)    |> step4(...)    |> step5(...)    |> step6(...)    |> step7(...);

要:

1
2
3
4

$payload    |> normalizePayload(...)    |> validatePayload(...)    |> buildDto(...);

重构清单:安全地从嵌套调用迁移到管道

如果你想在现有代码库引入 |>,这是个实用方法,不会搞坏东西或惹恼团队。

从有测试覆盖的转换开始

选一个函数:

  • • 有清晰的输入/输出
  • • 不修改全局状态
  • • 有单元或集成测试覆盖

逻辑已经稳定时管道最容易(也最安全)。

先把嵌套调用转成顺序步骤(可选但有效)

如果你从这开始:

1

$out = c(b(a($in)));

改写成:

1
2
3
4

$tmp = $in;$tmp = a($tmp);$tmp = b($tmp);$out = c($tmp);

这让逻辑阶段明确。然后管道化:

1
2
3
4

$out = $in    |> a(...)    |> b(...)    |> c(...);

用小的"可配置 callable"辅助函数处理多参数函数

不要到处撒包装闭包,集中模式如:

1
2
3
4

function withDelimiter(string $d): Closure{    returnfn (string $v): array => explode($d, $v);}

这让管道保持干净一致。

保持验证语义一致

如果你的旧代码失败时返回 null,不要在管道里悄悄换成抛异常,除非你准备好更新调用代码。

明确管道是:

  • • 返回结果或 null
  • • 返回结果或 false
  • • 无效输入时抛异常

管道可以表达任何这些风格——但随机混用让代码更难理解。

采用一种格式风格并坚持

可读的管道通常这样:

1
2
3
4
5

$result = $value    |> step1(...)    |> step2(...)    |> (fn ($x) => step3($x))    |> step4(...);

常见做法:

  • • 每行一个阶段
  • • 对齐管道符
  • • 闭包保持短
  • • 长闭包提取成命名函数

加"检查点"调试,然后移除

重构期间,插入 inspect() 阶段验证中间值。一切检查通过后,移除或降级成正式日志。

用代码审查强制"管道用于转换,不是用于一切"

管道操作符可以提高可读性。也可以变成隐藏复杂性的时尚声明。

一个简单的审查指南有帮助:

  • • 用 |> 做转换管道
  • • 避免 |> 做复杂分支或副作用密集的序列
  • • 优先命名函数而不是长内联闭包

结论:|> 最好用在读起来像故事的时候

PHP 8.5 的管道操作符不是替代经典 PHP 风格——它是补充。

用它当你想:

  • • 把转换表达成从左到右的流
  • • 减少嵌套括号
  • • 让"数据故事"在代码里可见

避免它当它变成:

  • • 隐藏的副作用
  • • 密集的闭包链
  • • 伪装成优雅的复杂分支

如果你保持管道聚焦,给有意义的步骤命名,把调试/验证当作一等公民,|> 能让 PHP 代码感觉明显更现代——不牺牲团队需要的实用、可读风格。

参考

  • • PHP 手册:"函数式操作符"(管道操作符 |>;callable 约束;箭头函数括号要求)
  • • PHP RFC:"Pipe Operator v3"(设计、优先级说明、引用限制、性能说明)

引用链接

[1] 原文 PHP 8.5 管道操作符 (|>) 告别嵌套函数地狱,写出清晰的数据管道: https://catchadmin.com/post/2026-01/php85-pipe-operator-clean-data-pipelines

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 23:21:53 HTTP/2.0 GET : https://f.mffb.com.cn/a/460432.html
  2. 运行时间 : 0.093640s [ 吞吐率:10.68req/s ] 内存消耗:4,604.55kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=50c0f707913a164df0177cb0b395c72f
  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.000443s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000817s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000318s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000307s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000570s ]
  6. SELECT * FROM `set` [ RunTime:0.000267s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000599s ]
  8. SELECT * FROM `article` WHERE `id` = 460432 LIMIT 1 [ RunTime:0.000795s ]
  9. UPDATE `article` SET `lasttime` = 1770564113 WHERE `id` = 460432 [ RunTime:0.007278s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000276s ]
  11. SELECT * FROM `article` WHERE `id` < 460432 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000496s ]
  12. SELECT * FROM `article` WHERE `id` > 460432 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.003234s ]
  13. SELECT * FROM `article` WHERE `id` < 460432 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000935s ]
  14. SELECT * FROM `article` WHERE `id` < 460432 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005884s ]
  15. SELECT * FROM `article` WHERE `id` < 460432 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001035s ]
0.095266s