乐于分享
好东西不私藏

【极速学习spark源码】一个RDD action 是怎么变成 Task 的

【极速学习spark源码】一个RDD action 是怎么变成 Task 的

基于 Spark 4.2,分支 branch-4.2

阅读时长约 10 分钟 · 入门到中级


背景

上一篇文章我们走完了「一条 SQL 在 Spark 中的一生」——从 spark.sql 一直到 executedPlan.execute() 产生了 RDD。

那 RDD 又是怎么执行的?

rdd.collect()

或者哪怕你写的不是 RDD:

df.show()
df.count()

这些 action 背后触发的是同一个机制。这篇文章就回答一个问题:

rdd.count() 这一句话,从 Driver 到 Executor,到底经过了几步?


一、流程图:一条完整的调用链

rdd.count()                          ← RDD action    ↓SparkContext.runJob                  ← 入口    ↓DAGScheduler.runJob / submitJob      ← 事件循环    ↓DAGScheduler.handleJobSubmitted      ← 创建 ResultStage    ↓DAGScheduler.submitStage             ← 递归提交父 Stage    ↓DAGScheduler.submitMissingTasks      ← 创建 Task 对象    ↓TaskSchedulerImpl.submitTasks        ← 调度层    ↓SchedulerBackend.reviveOffers()      ← 调用集群管理器    ↓资源满足 → resourceOffers             ← 分配 Task 到 Executor    ↓CoarseGrainedSchedulerBackend → Executor.launchTask               ← 网络传输 TaskDescription    ↓Executor.TaskRunner.run              ← 反序列化 + 执行    ↓Task.run → ResultTask.runTask        ← 真正的逻辑执行    ↓结果序列化 → 回传给 Driver

关键认知:从 count() 到真正的 ResultTask.runTask,中间隔了 10 层以上的调用。每一层都有自己明确的职责。


二、起点:RDD action

RDD 的方法分成两类:

  • transformation(map / filter / flatMap)—— 只构建 RDD 血缘,不触发执行

  • action(count / collect / reduce / take / saveAsTextFile)—— 触发真正的执行

看 RDD.scala:1320

def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum

看 RDD.scala:1072

def collect(): Array[T] = withScope {  val results = sc.runJob(this(iter: Iterator[T]) => iter.toArray)  import org.apache.spark.util.ArrayImplicits._  Array.concat(results.toImmutableArraySeq: _*)}

所有 action 最终都调用 sc.runJob(...),传入 RDD 实例 和 一个分区处理函数


三、SparkContext.runJob:守护检查 + 下发给 DAGScheduler

SparkContext.scala:2481

def runJob[T, U: ClassTag](    rdd: RDD[T],    func: (TaskContext, Iterator[T]) => U,    partitions: Seq[Int],    resultHandler: (Int, U) => Unit): Unit = {  if (stopped.get()) {    throw new IllegalStateException("SparkContext has been shutdown")  }  val callSite = getCallSite()  val cleanedFunc = clean(func)  dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, resultHandler, localProperties.get)  progressBar.foreach(_.finishAll())  rdd.doCheckpoint()}

SparkContext 在这里只做两件事:

  1. 检查应用是否已停止

  2. 序列化用户函数(clean 确保闭包里引用的外部变量是可序列化的)

然后立刻甩锅给 dagScheduler.runJob


四、DAGScheduler:事件循环

DAGScheduler 的设计基于事件循环。所有操作都是通过 eventProcessLoop.post(event) 来异步触发的,而不是同步调用。

DAGScheduler.scala:984。下面是简化后的代码,保留关键路径:

def submitJob[T, U](    rdd: RDD[T], func: ..., partitions: ...,    callSite: ..., resultHandler: ...,    properties: Properties): JobWaiter[U] = {  // 校验分区范围  // 预计算 RDD partitions(避免在事件循环里慢)  val jobId = nextJobId.getAndIncrement()  if (partitions.isEmpty) { /* 立即返回 */ }  val waiter = new JobWaiter[U](...)  // 异步触发  eventProcessLoop.post(JobSubmitted(    jobId, rdd, func2, partitions.toArray, callSite, waiter, ...))  waiter}

DAGScheduler.scala:1043 的 runJob 进一步对 submitJob 包了一层同步等待。下面是简化后的伪代码,重点看 submitJob → await completionFuture 这个结构:

def runJob[T, U](...): Unit = {  val waiter = submitJob(rdd, func, partitions, callSite, resultHandler, properties)  ThreadUtils.awaitReady(waiter.completionFuture, Duration.Inf)  waiter.completionFuture.value.get match {    case scala.util.Success(_) => // job succeeded    case scala.util.Failure(exception) => throw exception  }}

五、handleJobSubmitted:Stage 划分

事件循环最终调度到 handleJobSubmittedDAGScheduler.scala:1400。下面是简化后的伪代码

private[scheduler] def handleJobSubmitted(    jobId: Int, finalRDD: RDD[_], func: ...,    partitions: Array[Int], callSite: ..., listener: ...,    properties: Properties): Unit = {  val finalStage = createResultStage(finalRDD, func, partitions, jobId, callSite)  val job = new ActiveJob(jobId, finalStage, callSite, listener, artifacts, properties)  submitStage(finalStage)  submitWaitingStages()}

Stage 划分的核心逻辑在 getMissingParentStagesDAGScheduler.scala:837)。它的规则可以用一句话概括:

从最后一个 RDD 往前推,碰到宽依赖(ShuffleDependency)就切开,创建一个新的 Stage。

具体说:

  • createResultStage → 从 finalRDD 倒推,找到最上游的 ShuffleDependency 边界

  • 每切一次创建 ShuffleMapStage,最后一个 stage 创建 ResultStage

  • 每个 ShuffleMapStage 的输出被 Shuffle 持久化,结果可以被下游 Reuse

  • ResultStage 直接用 func 计算并返回给 Driver

这决定了 Stage 什么时候可以并行:

  • 同一个 Stage 里的 Task 并发执行,但不跨机器 shuffle

  • 不同 Stage 之间串行:上一个 Stage 的全部 Task 完成后,下一个 Stage 的 Task 才开始


六、submitStage:递归提交父 Stage

DAGScheduler.scala:1540。下面是简化后的伪代码

private def submitStage(stage: Stage): Unit = {  val missing = getMissingParentStages(stage).sortBy(_.id)  if (missing.isEmpty) {    submitMissingTasks(stage, jobId.get)  } else {    for (parent <- missing) {      submitStage(parent)        // 先递归提交父 Stage    }    waitingStages += stage       // 当前 Stage 进入等待队列  }}

这段代码很关键:

  • submitStage 会递归调用自己

  • 遇到父 Stage 还没提交,就先提交父 Stage

  • 直到某个 Stage 的所有依赖都已经就绪,才真正执行 submitMissingTasks 下发 Task


七、submitMissingTasks:创建 Task 对象

DAGScheduler.scala:1635

当发现某个 Stage 的所有父 Stage 执行完毕、数据(ShuffleMapStage 的输出)已经可用,就会创建具体的 Task 对象。下面是简化后的伪代码

private def submitMissingTasks(stageStagejobIdInt): Unit = {  val partitionsToComputeSeq[Int] = stage.findMissingPartitions()  // 序列化 RDD + func/shuffleDep 并 broadcast  // ...  val tasksSeq[Task[_]] = stage match {    case stageShuffleMapStage =>      partitionsToCompute.map { id =>        new ShuffleMapTask(stage.id, ..., taskBinary, part, ...)      }    case stageResultStage =>      partitionsToCompute.map { id =>        new ResultTask(stage.id, ..., taskBinary, part, ...)      }  }  taskScheduler.submitTasks(new TaskSet(    tasks.toArray, stage.id, stage.latestInfo.attemptNumber(), jobId, ...))}

两个关键细节:

Task 的种类对应 Stage 的种类:

Stage 类型Task 类型输出
ShuffleMapStageShuffleMapTaskMapStatus(元数据,不包含数据本身)
ResultStageResultTask用户 func 的返回值

Task 的序列化是在 Driver 端完成的:taskBinary 是 Broadcast[Array[Byte]],包含 RDD + ShuffleDependency / func 的序列化字节,通过广播变量分发到所有 Executor。


八、TaskSchedulerImpl.submitTasks:进入调度层

TaskSchedulerImpl.scala:243。下面是简化后的伪代码

override def submitTasks(taskSet: TaskSet): Unit = {  val manager = createTaskSetManager(taskSet, maxTaskFailures)  // 注册到调度池  schedulableBuilder.addTaskSetManager(manager, manager.taskSet.properties)  // 通知 backend 分配资源  backend.reviveOffers()}

这里做了三件事:

  1. 为这个 TaskSet 创建 TaskSetManager —— 负责跟踪每个 Task 的状态、失败重试、推测执行

  2. 把 TaskSetManager 注册到调度池(FIFO / Fair)—— 决定了多 Job 时的优先级

  3. backend.reviveOffers() —— 向集群管理器(Standalone / YARN / K8s)发送信号:"有新的 Task 要跑了,过来分配资源"

backend 就是 SchedulerBackend。它的实现取决于部署模式:

  • LocalSchedulerBackend(本地模式)

  • StandaloneSchedulerBackend(Standalone 集群)

  • CoarseGrainedSchedulerBackend(YARN / K8s)


九、resourceOffers:把 Task 分配给 Executor

集群管理器分配资源后,TaskSchedulerImpl.resourceOffersTaskSchedulerImpl.scala:512)会被调用:

def resourceOffers(offers: IndexedSeq[WorkerOffer]): Seq[Seq[TaskDescription]] = {  // 打乱 offer 顺序(负载均衡)  val shuffledOffers = shuffleOffers(filteredOffers)  // 轮询每个 TaskSetManager,获取它想要的 Task  for (taskSet <- sortedTaskSets) {    // TaskSetManager 根据数据本地性(PROCESS_LOCAL > NODE_LOCAL > RACK_LOCAL > ANY)选择 Task  }}

TaskSetManager 内部维护了每个 Task 的数据本地性等级。它尽可能让 Task 在数据所在的 Executor 上运行,避免网络传输。

最终产出的是 Seq[TaskDescription]——每个 TaskDescription 包含了:

  • Task ID

  • Executor ID

  • 序列化的 Task 二进制数据

这会被 CoarseGrainedSchedulerBackend 通过网络发送给对应的 Executor。


十、Executor.launchTask → TaskRunner.run:在 Executor 上真正跑起来

Executor.scala:551

def launchTask(context: ExecutorBackend, taskDescription: TaskDescription): Unit = {  val tr = createTaskRunner(context, taskDescription)  runningTasks.put(taskId, tr)  threadPool.execute(tr)}

TaskRunnerExecutor.scala:687)是一个 Runnable。它的 run() 方法做的事:

  1. 反序列化taskDescription.serializedTask 得到真正的 Task 对象

  2. 调用 Task.run(taskAttemptId, attemptNumber, ...)Task.scala:87

  3. Task.run 内部调用 runTask(context) 的多态实现

对于 ResultTaskResultTask.scala:78):

override def runTask(context: TaskContext): U = {  val (rdd, func) = ser.deserialize[(RDD[T], (TaskContext, Iterator[T]) => U)](    ByteBuffer.wrap(taskBinary.value), ...)  func(context, rdd.iterator(partition, context))}

对于 ShuffleMapTaskShuffleMapTask.scala:82):

override def runTask(context: TaskContext): MapStatus = {  val (rdd, dep) = ser.deserialize[(RDD[_], ShuffleDependency[_, _, _])](    ByteBuffer.wrap(taskBinary.value), ...)  // 计算结果写入 shuffle,返回 MapStatus  val writer = dep.shuffleHandle    .asInstanceOf[BaseShuffleHandle[_, _, _]]    .shuffleWriterProcessor    .createWriter(...)  writer.write(rdd.iterator(partition, context).asInstanceOf[Iterator[_ <: Product2[Any, Any]]])  Option(writer.stop(success = true)).orNull}

十一、结果回传

Task 执行完毕后,结果会通过 ExecutorBackend.statusUpdate 发送回 Driver。

  • ShuffleMapTask 返回 MapStatus(告诉 Driver:我这边的数据写到哪里了、每个 reducer 拉取的数据量是多少)

  • ResultTask 返回的是序列化后的用户函数结果

Driver 端 DAGScheduler.handleTaskCompletionDAGScheduler.scala:2203)处理结果:

  • 如果是 ResultTask 完成且全部结束 → Job 成功

  • 如果是 ShuffleMapTask 完成 → 检查此 ShuffleMapStage 是否全部完成,是则提交下游 Stage


十二、实战:把整条调用链看一遍

// 准备val rdd = sc.parallelize(1 to 1004)// 第一步:RDD actionprintln("Before count()")val count = rdd.count()println(s"count = $count")// 第二步:用 RDD.toDebugString 看 Stage 和依赖println("\nRDD Lineage:")println(rdd.toDebugString)// 第三步:看 Job 的 stage 信息// 注意:需要先设置 spark.ui.enabled = false,不然需要在 Web UI 上看println("\nDone")

输出:

Before count()
count = 100

RDD Lineage:
(4) ParallelCollectionRDD[0] at parallelize at RDDtest02.scala:41 []

Done

更直观的方式是开起 Spark Web UI 看 Job 视图:

http://localhost:4040/jobs/

你会看到一个 Job(ID 0),展开能看到:

  • 1 个 ResultStage

  • 4 个 Task

  • 每个 Task 的状态、时长、所在 Executor


十三、收尾

从 rdd.count() 到真正的 Task 在 Executor 上跑起来,完整调用链:

rdd.count()  → SparkContext.runJob:2481    → DAGScheduler.submitJob:984      → eventProcessLoop.post(JobSubmitted)     ← 事件循环入口        → handleJobSubmitted:1400          → createResultStage:704               ← 创建 ResultStage            → submitStage:1540                  ← 递归提交父 Stage              → getMissingParentStages:837      ← Stage 划分(按 Shuffle 边界切)                → submitMissingTasks:1635       ← 创建 Task 对象                  → new ResultTask / ShuffleMapTask                    → taskScheduler.submitTasks:243 ← 进入调度层                      → backend.reviveOffers()                        → resourceOffers:512   ← 分配 Task 到 Executor                          → Executor.launchTask:551                            → TaskRunner.run:806                              → Task.run:87                                → ResultTask.runTask:78                                  → rdd.iterator(partition, context)

最值得带走的三个认知:

  1. DAGScheduler 不只负责"切 Stage"。它还协调了 Job 的完整生命周期:事件循环 → Stage 划分 → 父 Stage 递归提交 → Task 创建 → 结果处理 → Stage 推进。事件循环的设计让所有操作单线程串行化,避免了并发管理的复杂度。

  2. Stage 的本质是一组无需 shuffle 的 Task。shuffle 依赖是 Spark 唯一"不得不串行"的边界,所以每个 shuffle 边界会天然形成一个 Stage 边界。同一个 Stage 内的所有 Task 可以并发跑。

  3. Task 在 Driver 端序列化,在 Executor 端反序列化执行taskBinary 是一个 Broadcast,包含 RDD + func/ShuffleDependency 的全量数据。这就是 Task 隔离性(分段执行、互不干扰)的来源,也是 Task Not Serializable 错误的源头。


每天花费10分钟学习spark,让你技术之路走得更稳、更快。

喜欢的点个关注。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-16 23:08:05 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/754339.html
  2. 运行时间 : 0.321568s [ 吞吐率:3.11req/s ] 内存消耗:4,801.90kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=1d959505f632050c232384463124394e
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001039s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001673s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.006896s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000720s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001434s ]
  6. SELECT * FROM `set` [ RunTime:0.001124s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001492s ]
  8. SELECT * FROM `article` WHERE `id` = 754339 LIMIT 1 [ RunTime:0.003653s ]
  9. UPDATE `article` SET `lasttime` = 1781622485 WHERE `id` = 754339 [ RunTime:0.030574s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000754s ]
  11. SELECT * FROM `article` WHERE `id` < 754339 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.014483s ]
  12. SELECT * FROM `article` WHERE `id` > 754339 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.024974s ]
  13. SELECT * FROM `article` WHERE `id` < 754339 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.013067s ]
  14. SELECT * FROM `article` WHERE `id` < 754339 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002138s ]
  15. SELECT * FROM `article` WHERE `id` < 754339 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.050644s ]
0.327951s