当前位置:首页>php>PHP 协程原理深度解析:Generator 背后藏着什么秘密?

PHP 协程原理深度解析:Generator 背后藏着什么秘密?

  • 2026-07-01 12:03:10
PHP 协程原理深度解析:Generator 背后藏着什么秘密?
PHP 体系课程,请关注以上服务号
摘要:PHP 协程原理深度解析:Generator 背后藏着什么秘密?本文从 PHP Generator 的底层机制讲起,带你看清 Swoole 协程、yield 暂停点、EventLoop 的本质,最后用实战代码对比同步 vs 协程并发,响应时间从 3000ms 降到 200ms,让你彻底搞懂 PHP 协程是什么、为什么快、怎么用。

你以为的协程 vs 真实的协程

很多同学第一次听到"协程"这个词,脑子里会冒出两个错误理解:

❌ 误区 1:协程就是多线程,能并行执行
❌ 误区 2:协程用了魔法,自动帮你处理并发

实际上:

协程是单线程的、协作式的、用户态调度的执行单元。

它的核心思想只有一句话:遇到 I/O 等待,主动让出 CPU,等 I/O 好了再回来继续跑。


第一章:从 Generator 说起

PHP 协程的基础是 Generator(生成器),它是协程的最小实现形式。先看一段代码:

<?php

/**
 * 最简单的 Generator 示例
 * yield 是暂停点,每次调用 next() 会恢复到下一个 yield
 */

functionsimpleGenerator(): Generator
{
echo"【步骤 1】开始执行\n";
yield'first';   // 第一次暂停,返回 'first'

echo"【步骤 2】恢复执行\n";
yield'second';  // 第二次暂停,返回 'second'

echo"【步骤 3】执行完毕\n";
// Generator 函数结束
}

$gen = simpleGenerator(); // 此时函数体【不会执行】,只是创建 Generator 对象

echo"Generator 已创建,函数体还没跑\n";

$gen->current(); // 运行到第一个 yield,输出"步骤 1",暂停
echo"第一次暂停,返回值:" . $gen->current() . "\n";

$gen->next();    // 恢复,运行到第二个 yield,输出"步骤 2",暂停
echo"第二次暂停,返回值:" . $gen->current() . "\n";

$gen->next();    // 恢复,运行完毕,输出"步骤 3"

输出结果:

Generator 已创建,函数体还没跑
【步骤 1】开始执行
第一次暂停,返回值:first
【步骤 2】恢复执行
第二次暂停,返回值:second
【步骤 3】执行完毕

这里有个关键认知:

操作
发生了什么
simpleGenerator()
创建 Generator 对象,函数体不执行
$gen->current()
执行到第一个 yield暂停
$gen->next()
从上次暂停点恢复,到下一个 yield 暂停

这就是协程的本质:可以暂停和恢复的函数。


第二章:PHP 底层是怎么实现暂停/恢复的?

2.1 Generator 的内部结构

PHP 的 Generator 底层对应一个 C 结构体 _zend_generator,核心字段如下:

// PHP 源码简化版(zend_generator.h)
struct _zend_generator {
    zend_object std;

// 保存当前执行状态(寄存器、栈帧、opline 指针)
    zend_execute_data *execute_data;

// yield 返回给调用方的值
    zval value;

// 调用方 send() 传进来的值
    zval send_target;

// 执行状态标志
uint32_t flags;
// ZEND_GENERATOR_CURRENTLY_RUNNING = 正在执行
// ZEND_GENERATOR_COMPLETED        = 已完成
};

当执行到 yield 时,PHP 会:

  1. 把当前函数的**执行栈帧(execute_data)**保存到堆上
  2. 把 yield 的值写入 $gen->value
  3. 把控制权交回给调用方

当调用 $gen->next() 时,PHP 会:

  1. 从堆上恢复执行栈帧
  2. 把 send() 传入的值写入 send_target
  3. 从上次 yield 之后继续执行

这整个过程发生在用户态,不需要内核介入,比线程切换(需要上下文切换)轻量 100 倍以上。

2.2 yield from 与协程调度

PHP 7 引入了 yield from,让 Generator 可以委托给另一个 Generator,这是实现协程调度器的基础:

<?php

/**
 * yield from 示例:子协程委托
 */

functioninnerCoroutine(): Generator
{
echo"内层协程开始\n";
yield'inner-1';
echo"内层协程继续\n";
yield'inner-2';
return'inner-done'// Generator 可以有返回值!
}

functionouterCoroutine(): Generator
{
echo"外层协程开始\n";
yield'outer-1';

// 委托给内层协程,内层跑完才继续
$innerResult = yieldfrominnerCoroutine();

echo"内层协程返回值:{$innerResult}\n";
yield'outer-2';
}

$gen = outerCoroutine();
while ($gen->valid()) {
echo"当前 yield 值:" . $gen->current() . "\n";
$gen->next();
}

第三章:真正的协程并发——EventLoop 登场

Generator 只是协程的暂停/恢复机制,要实现真正的"并发",还需要 EventLoop(事件循环)

3.1 协程 + EventLoop 的工作原理

┌─────────────────────────────────────────────────────┐
│                     EventLoop                        │
│                                                      │
│  ┌──────────┐  遇到IO   ┌──────────────────────────┐ │
│  │ 协程 A   │ ────────→ │  IO 等待队列              │ │
│  │(HTTP请求)│  yield    │  - 协程A等待 MySQL 响应   │ │
│  └──────────┘           │  - 协程B等待 Redis 响应   │ │
│                         └──────────────────────────┘ │
│  ┌──────────┐  运行中   ┌──────────────────────────┐ │
│  │ 协程 B   │           │  IO 完成,恢复协程         │ │
│  │(Redis查询)│◄─────────│  - MySQL 响应 → 恢复协程A │ │
│  └──────────┘           │  - Redis 响应 → 恢复协程B │ │
│                         └──────────────────────────┘ │
└─────────────────────────────────────────────────────┘

关键点:单线程内,当协程 A 等待 MySQL 时,EventLoop 切换去跑协程 B;B 等待 Redis 时,说不定 A 的 MySQL 响应回来了,再切回去继续 A。这就是"协程并发"。

3.2 用纯 PHP 实现一个简单调度器

<?php

/**
 * 极简协程调度器(纯教学用途)
 * 演示 EventLoop 如何调度多个协程
 */

classSimpleScheduler
{
/** @var SplQueue<Generator> 待运行的协程队列 */
privateSplQueue$queue;

publicfunction__construct()
{
$this->queue = newSplQueue();
    }

/**
     * 添加协程到调度队列
     */

publicfunctionadd(Generator$coroutine): void
{
$this->queue->enqueue($coroutine);
    }

/**
     * 运行所有协程直到全部完成
     */

publicfunctionrun(): void
{
while (!$this->queue->isEmpty()) {
/** @var Generator $coroutine */
$coroutine = $this->queue->dequeue();

// 协程还没跑完,继续推进
if ($coroutine->valid()) {
$coroutine->next();

// 还没完成,放回队尾等下次调度
if ($coroutine->valid()) {
$this->queue->enqueue($coroutine);
                }
            }
        }
    }
}

/**
 * 模拟一个需要多步骤的协程任务
 *
 * @param string $name 协程名称
 * @param int $steps 执行步骤数
 */

functiontask(string$nameint$steps): Generator
{
for ($i = 1$i <= $steps$i++) {
echo"[{$name}] 执行第 {$i} 步\n";
yield// 让出 CPU,给其他协程机会
    }
echo"[{$name}] 完成!\n";
}

// 创建调度器,加入 3 个并发任务
$scheduler = newSimpleScheduler();
$scheduler->add(task('任务A'3));
$scheduler->add(task('任务B'2));
$scheduler->add(task('任务C'4));

$scheduler->run();

输出(交替执行!):

[任务A] 执行第 1 步
[任务B] 执行第 1 步
[任务C] 执行第 1 步
[任务A] 执行第 2 步
[任务B] 执行第 2 步
[任务C] 执行第 2 步
[任务A] 执行第 3 步
[任务B] 完成!
[任务C] 执行第 3 步
[任务A] 完成!
[任务C] 执行第 4 步
[任务C] 完成!

三个任务交替执行,这就是协程调度的威力。


第四章:Swoole 协程 —— PHP 协程的工业级实现

手写调度器只是玩具,生产环境用 Swoole。Swoole 在 PHP 扩展层实现了完整的协程运行时,彻底接管了 I/O 操作。

4.1 Swoole 协程的底层架构

PHP 用户代码
     ↓ 调用 Co::create() 创建协程
Swoole 协程调度器(C++ 实现)
     ↓ 遇到 I/O
Hook 层(替换 file_get_contents / mysql_connect / curl 等)
     ↓
libuv / epoll(Linux)/ kqueue(macOS)
     ↓ I/O 完成事件
调度器恢复对应协程
     ↑ 继续执行 PHP 代码

Swoole 的"协程 Hook"是杀手锏:你用原来的 PDO、Redis、curl 代码,Swoole 自动把它变成协程异步调用,不需要改业务代码!

<?php

// 开启 Hook,让原生 PHP 函数自动协程化
Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL);

Swoole\Coroutine\run(function () {
// 并发创建 5 个协程,同时发起 HTTP 请求
$wg = newSwoole\Coroutine\WaitGroup();

$results = [];

for ($i = 0$i < 5$i++) {
$wg->add();
Swoole\Coroutine::create(function () use ($i, &$results, $wg) {
            // 这里用 curl,被 Hook 后自动变成协程异步
            $ch = curl_init("https://httpbin.org/delay/1?id={$i}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);

$start = microtime(true);
$response = curl_exec($ch);   // ← 遇到网络等待,自动让出 CPU
$duration = round((microtime(true) - $start) * 1000);

curl_close($ch);
$results[$i] = "协程 {$i}{$duration}ms";
$wg->done();
        });
    }

$wg->wait(); // 等待所有协程完成

foreach ($resultsas$result) {
echo$result . "\n";
    }
});

性能对比:

方式
5个请求总耗时
原因
同步串行
~5000ms
一个一个等
Swoole 协程并发
~1050ms
同时等待,只算最慢那个
提升约 5x
省掉了串行等待时间

4.2 协程 vs 多进程 vs 多线程

<?php

/**
 * 三种并发模型对比(概念演示)
 *
 * 场景:处理 100 个 API 请求,每个耗时 100ms(I/O bound)
 */


// ❌ 同步串行
// 耗时:100 * 100ms = 10,000ms
// 内存:低,只有 1 个执行上下文

// ⚠️ 多进程(PHP-FPM 模式)
// 耗时:ceil(100/32) * 100ms ≈ 400ms(32个 worker)
// 内存:高,每进程 ~30MB,100请求需要 100 个进程=3GB 内存峰值
// 上下文切换:内核态,开销大

// ✅ Swoole 协程
// 耗时:~100ms(全部并发,只等最慢那个)
// 内存:低,每协程 ~4KB 栈,100协程 ≈ 400KB
// 上下文切换:用户态,几乎零开销
对比维度
同步
多进程
Swoole 协程
并发能力
内存占用
高(每进程 30MB+)
极低(每协程 4KB)
上下文切换开销
高(内核态)
极低(用户态)
适合场景
简单脚本
CPU 密集型
I/O 密集型
PHP 改造成本
中(需 Swoole)

第五章:实战 —— 协程并发数据库查询

来一个真实场景:电商首页需要同时查询商品、用户信息、推荐列表、广告位四个接口。

<?php

useSwoole\Coroutine;
useSwoole\Coroutine\Channel;

/**
 * 协程并发查询演示
 * 同时发起 4 个数据库/Redis 查询,总耗时 = 最慢那个查询的时间
 */

functionfetchHomePageDataConcurrently(): array
{
$channel = newChannel(4); // 容量 4 的 Channel,用于收集结果

// 协程 1:查商品列表(模拟耗时 200ms)
Coroutine::create(function () use ($channel) {
Coroutine::sleep(0.2); // 模拟 DB 查询
$channel->push(['products' => ['iPhone 15''MacBook Pro''AirPods']]);
    });

// 协程 2:查用户信息(模拟耗时 50ms)
Coroutine::create(function () use ($channel) {
Coroutine::sleep(0.05); // 模拟 Redis 查询
$channel->push(['user' => ['id' => 1001'name' => '张三''vip' => true]]);
    });

// 协程 3:查推荐列表(模拟耗时 150ms)
Coroutine::create(function () use ($channel) {
Coroutine::sleep(0.15); // 模拟推荐算法 API
$channel->push(['recommendations' => ['商品A''商品B''商品C']]);
    });

// 协程 4:查广告位(模拟耗时 80ms)
Coroutine::create(function () use ($channel) {
Coroutine::sleep(0.08); // 模拟广告服务
$channel->push(['ads' => ['活动1''促销2']]);
    });

// 等待 4 个结果全部返回
$result = [];
for ($i = 0$i < 4$i++) {
$data = $channel->pop(3.0); // 最多等 3 秒
if ($data !== false) {
$result = array_merge($result$data);
        }
    }

return$result;
}

// 在 Swoole 协程上下文中运行
Coroutine\run(function () {
$start = microtime(true);

$data = fetchHomePageDataConcurrently();

$duration = round((microtime(true) - $start) * 1000);
echo"并发查询完成,耗时:{$duration}ms\n";
echo"获取数据:" . implode(', 'array_keys($data)) . "\n";

// 同步串行耗时:200 + 50 + 150 + 80 = 480ms
// 协程并发耗时:max(200, 50, 150, 80) ≈ 200ms
// 提升:约 2.4 倍
});

性能数据:

  • 同步串行:200 + 50 + 150 + 80 = 480ms
  • 协程并发:max(200, 50, 150, 80) ≈ 200ms
  • 性能提升:2.4 倍

查询越多、I/O 越慢,协程的优势越明显。


第六章:使用协程的注意事项

⚠️ 1. 不是所有场景都适合协程

适合协程的场景:
✅ 高并发 I/O(HTTP 请求、数据库、Redis、文件读写)
✅ 需要同时等待多个外部接口返回结果

不适合协程的场景:
❌ CPU 密集型(大量计算、图像处理)— 用多进程
❌ 简单的 PHP 脚本 — 用普通 PHP 即可

⚠️ 2. 协程安全问题

<?php

// ❌ 错误示例:协程共享全局状态,数据竞争
$globalCounter = 0;

Coroutine::create(function () {
global$globalCounter;
$tmp = $globalCounter;
Coroutine::sleep(0.001); // 让出 CPU,其他协程可能修改 $globalCounter
$globalCounter = $tmp + 1// 数据竞争!结果不可预期
});

// ✅ 正确示例:每个协程用独立变量,通过 Channel 通信
$channel = newChannel(1);
Coroutine::create(function () use ($channel) {
    $counter = 0;
$counter++;
$channel->push($counter); // 通过 Channel 传递结果
});
$result = $channel->pop();

⚠️ 3. 协程不能替代进程隔离

协程是单线程的,一个协程崩溃(PHP Fatal Error)会导致整个进程挂掉。生产环境一定要配合 Supervisor + 进程守护


总结

用一张图总结 PHP 协程的核心知识:

PHP 协程体系
├── 基础层:Generator(yield 暂停/恢复机制)
│   ├── current() — 获取 yield 的值
│   ├── next()    — 推进到下一个 yield
│   └── send()    — 向协程传入值并推进

├── 调度层:EventLoop(事件循环)
│   ├── 协程队列管理
│   ├── I/O 事件监听(epoll/kqueue)
│   └── 协程切换(用户态,极低开销)

└── 工业级:Swoole 协程运行时
    ├── SWOOLE_HOOK_ALL — 自动 Hook 原生 PHP I/O
    ├── Coroutine::create() — 创建协程
    ├── Channel — 协程间通信
    └── WaitGroup — 等待协程组完成

PHP 协程的本质只有两句话:

  1. yield
     让出 CPU,保存现场到堆上
  2. EventLoop 监听 I/O,完成后恢复现场继续跑

高并发不是魔法,是让 CPU 在等待的间隙里去做别的事

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 15:36:10 HTTP/2.0 GET : https://f.mffb.com.cn/a/494365.html
  2. 运行时间 : 0.281907s [ 吞吐率:3.55req/s ] 内存消耗:4,583.26kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=8f2d72bf399d7181f18e4d8a1ade8e0f
  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.000882s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001542s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.004361s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000795s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001617s ]
  6. SELECT * FROM `set` [ RunTime:0.022358s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001631s ]
  8. SELECT * FROM `article` WHERE `id` = 494365 LIMIT 1 [ RunTime:0.006633s ]
  9. UPDATE `article` SET `lasttime` = 1783064170 WHERE `id` = 494365 [ RunTime:0.005489s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.024578s ]
  11. SELECT * FROM `article` WHERE `id` < 494365 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.005244s ]
  12. SELECT * FROM `article` WHERE `id` > 494365 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.017892s ]
  13. SELECT * FROM `article` WHERE `id` < 494365 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006830s ]
  14. SELECT * FROM `article` WHERE `id` < 494365 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.008779s ]
  15. SELECT * FROM `article` WHERE `id` < 494365 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004750s ]
0.283355s