Laravel 生命周期

初衷

最近的一个开发项目是在laravel的框架上进行开发的,基于本人的学习习惯,每次在对一个新东西进行学习时,肯定要知其所以然,本博文讲述的是我在对laravel进行深入学习后,对于其生命周期的理解。

PHP生命周期

对于PHP的生命周期(简要概括,非本文重点),有一篇博文写的非常好,在理解PHP的生命周期之后,有利于我们进一步学习laravel的运行机制。

PHP的运行模式

  • web模式 :通过Apache or Nginx 来运行PHP脚本
  • cli模式 :在命令行下运行PHP脚本

通过SAPI接口运行PHP的五个阶段

  1. 模块初始化阶段 MINIT
  2. 请求初始化阶段 RINIT
  3. RUN PHP
  4. 请求结束 Request Shutdown
  5. 关闭模块 Module Shutdown

几个重点

  • 初始化其子内核是在第一阶段
  • 加载拓展代码,向zend引擎注册函数都在第一阶段末完成
  • 处理请求与PHP脚本真正的执行在2~4之间
  • 第三阶段zend在执行拓展时,若调用到拓展的函数,zend会将控制权交由该函数,直到函数运行结束

Laravel 生命周期

运行在PHP的阶段

如果已经对刚刚PHP本身的运行阶段有比较好的理解的话,就可以发现Laravel运行在上述的PHP生命周期第三阶段,也就是说,所有的变量都只会在这次的请求中生效,认识到这点,对Laravel做的事情就能更好的去理解。

入口文件

对每一个框架的学习,或许入口是最清晰的指向,Laravel的入口文件位于

public/index.php

通过观察源码可以总结出该入口分为以下四个阶段:


require __DIR__.'/../bootstrap/autoload.php';

1.加载Composer自动生成的ClassLoader,其中就有我们自己require的各项依赖

$app = require_once __DIR__.'/../bootstrap/app.php';

2.从源码分析,实例化了一个继承自Container(容器)的Application类,并且用该类的singleton方法注册了三个重要的绑定,将Illuminate下的三个核心__接口__(\Http\Kernel;\Console\Kernel;\Exceptions\Handler)绑定至当前项目对应的三个__实现类__中

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

3.实现kernel类,执行kernel类的handle方法处理请求,返回response

$kernel->terminate($request, $response);

4.处理终止中间件,进行回调


从一次请求的发起到结束,所经历的整个过程,可以从入口文件读出,Laravel是怎么处理这一过程的。

阶段深入

  1. 第一阶段是Composer的加载注册,在我另一篇博文有对Composer机制的剖析,这是传送门

  2. 第二阶段是实例化了一个继承自Container的Application实例,又把这句话打了一遍,其实这就Laravel一个很重要的概念--容器,关于容器这个Core Concept还是比较多,对其的探索详见我另一篇博文,还是传送门,但是他在生命周期的本阶段确实就是本阶段的第一句话,它就是准备好一个容器,让接下来伴随着请求的各项特性能够实现。

  3. 第三阶段,容器make了一个契约里的__Http\Kernel__接口,对应到了本项目的实现类里,通过源码分析,在使用了handle方法后,Laravel开始bootstrap下面的核心类:

[DetectEnvironment,
LoadConfiguration,
ConfigureLogging,
HandleExceptions,
RegisterFacades,
RegisterProviders,
BootProviders]
见词知意,到这步为止,我们可以大概知道我们写的Provider和Facade是在哪里开始被实现了。追溯源码,可以看到我们的请求作为一个share instance,传给了实例化的Pipeline类,由这个类去处理请求,如经过哪些中间件,定位到哪个路由,执行你自己编写的逻辑代码(__你的代码是在这一步执行的__),最后将处理的结果返回。

  1. 第四阶段,是终止与回调,终止中间件与其他需要回调的函数就是在这个阶段被执行的。

总结

本文到这里戛然而止,其实还有很多details与重点没有详讲,只是简单的罗列了Laravel的生命历程,因为Laravel的博大精深,为了不让文章过于臃肿,我将其Core Concepts分为几篇文章来讲,若要更深入的了解,还请关注我的以下几篇博文:

(由于本人时间问题,一些博文暂未写完~)
非常感谢大家的阅读,若有什么建议或问题欢迎与我交流。
Email:atrovervan@gmail.com

2016-10-25 00:37 112
Comments
Write a Comment