生命周期
最后更新于:2022-04-01 04:23:49
# 生命周期
前面[关于 Blink](https://github.com/bixuehujin/blink/blob/master/docs/zh-CN/1-1-about-blink.md)部分有过介绍,Blink 不像其他运行在 php-fpm 或者 mod_php 之上的传统 PHP 框架,它的生命周期 也是很不相同的,在使用 Blink 进行应用开发时,我们需要时刻牢记这一点,以减少不必要的困惑。
在 php-fpm 或者 mod_php 中,几乎所有的资源(诸如像对象、数据库链接等)都仅仅存在于一个请求之间,所有的这些资源都会在请求结束时释放。这样的 工作机制对于小规模的应用是没什么问题的,但对于大规模的应用,其所带来的性能开销是不可忽视的。这也是为什么 Blink 存在的原因,在 Blink 中, 我们尽最大努力减少资源的重复申请与释放,获得尽可能高的性能。
为此,Blink 的生命周期会比 php-fpm 或者 mod_php 之类更加复杂,我们在开发 Blink 应用的时候也需要谨慎的处理资源的申请与释放。一个 Blink 应用的有三个阶段,启动阶段、请求处理阶段和退出阶段,下面就每个阶段进行详细介绍:
## 启动阶段
首先,Blink 采用子进程来处理用户请求,每个子进程包含一个 Blink 应用程序(也就是一个 Blink Application 实例),每个应用会随着子进程的创建 而创建。
一旦 Blink 应用创建好后,`$application->bootstrap()` 方法将会被调用,启动应用,在这个方法中主要会做以下几件事情:
1. 设置应用的配置信息,比如默认时区
2. 注册应用服务,如日志、errorHandler等
3. 注册路由
一旦应用启动成功,他就会等待并处理服务器发送过来的请求。
## 请求处理
应用启动之后,就会开始等待处理请求,当有请求到来的时候,`$application->handleRequest()` 将会被调用来处理这个请求,下面是一个请求处理的 过程:
1. 路由分发,通过预先定义好的路由找到对应的控制器
2. 创建对应控制器实例
3. 调用注册好的 Request 中间件
4. 执行控制器对应的 Action
5. 调用注册好的 Response 中间件
6. 结束请求并把数据返回给服务器
与 php-fpm 或 mod_php 相比,Blink 很重要的不同就是一个应用同时处理多个请求。在这多个请求之间,Application 对象及其注册在其之上的服务 都是一直存在并且能够很好的复用,尽量减少了不必要的重新申请资源的开销。也正是因为这个原因,Blink 比 php-fpm 或 mod_php 的性能要高许多。
## 退出阶段
当一个应用(或者子进程)达到了 `maxRequests` 最大处理请求数量的限制或者接收到 `TERM` 信号时,该应用就会自动退出,对应进程内部的所有资源和 数据库链接都会被释放。