Laravel 是单入口文件的mvc重型框架,里面集成了消息队列,orm,ioc等功能模块。laravel的生命周期简述如下:
1、从`public\index.php`,进入框架;
2、注册加载composer自动生成的`class loader`,初始化第三方依赖;
3、生成容器(bootstrap/app.php),注册核心组件(Kernel::class);
4、处理请求,生成并返回响应;
5、结束请求,进行回调
从`public\index.php`开始。
注册加载composer自动生成的`class loader`,初始化第三方依赖,laravel本身实现的也已经高度组件化了。
使用上一步生成的容器`Container`类,从`bootstrap/app.php`脚本获取 Laravel 应用实例,注册laravel核心组件。
如果是web请求不是命令行请求,那么**创建 Laravel HTTP Kernel 核心**,请求被发送到`HTTP`内核。
HTTP 内核继承自 Illuminate\\Foundation\\Http\\Kernel 类,这个类中拥有三个核心成员变量 $app,$router,$bootstrappers。
~~~
protected $app;
protected $router;
protected $bootstrappers \= \[
\\Illuminate\\Foundation\\Bootstrap\\LoadEnvironmentVariables::class, # 加载 .env 中的配置信息
\\Illuminate\\Foundation\\Bootstrap\\LoadConfiguration::class, # 加载 config 目录中所有配置文件的配置信息
\\Illuminate\\Foundation\\Bootstrap\\HandleExceptions::class, # 异常处理
\\Illuminate\\Foundation\\Bootstrap\\RegisterFacades::class, # 注册门面
\\Illuminate\\Foundation\\Bootstrap\\RegisterProviders::class, # 注册Service Providers
\\Illuminate\\Foundation\\Bootstrap\\BootProviders::class, # 注册启动器
\];
~~~
$app 咱们已经说了足够多,就是应用容器,我们所有的工作都在这个容器中进行。
$router 路由对象,它提供路由相关的服务,帮助我们把网络请求分配给对应的路由进行逻辑处理,然后把处理的结果(网络响应)返回给我们,我们在web.php中定义的路由就是由它来管理的。
$bootstrappers 数组,这个数组中的任务项在网络请求被处理前运行,我们可以看到**环境检查,配置加载,异常处理,Facedes 门面注册,ServiceProvider 注册**等等任务都需要在网络请求被处理前被首先执行,而且这些任务是有前后顺序的,排在前面的会首先执行,这也很容易理解,因为不管是 Facades 还是 Service Providers 都是定义在 config 目录中的 app.php 文件中的,只有加载来配置之后才能注册门面和Service Providers。
结束请求,进行回调,终止 Laravel 应用,Laravel 到此也完成了它的历史使命。中间件中有一类的中间件,terminable middleware 的处理逻辑就是在这个阶段执行的。
**扩展知识【中间件】**
Middleware ,在 Kernel 以及它的基类 Illuminate\\Foundation\\Http\\Kernel 中定义了一系列的 middlewares ,借助这些中间件,就可以完成对用户请求的过滤和安全检查等等功能。
~~~
public function __construct(Application $app, Router $router)
{
$this->app = $app;
$this->router = $router;
$route->middlewarePriority = $this->middlewarePriority;
foreach ($this->middlewareGroups as $key => $middleware) {
$router->middlewareGroup($key, $middleware);
}
foreach ($this->routeMiddleware as $key => $middleware) {
$router->aliasMiddleware($key, $middleware);
}
}
~~~
中间件的作用:所有请求在处理前需要经过的 HTTP[中间件](https://laravel.com/docs/5.4/middleware),这些中间件处理[HTTP 会话](https://laravel.com/docs/5.4/session)的读写、判断应用是否处于维护模式、验证[CSRF 令牌](https://laravel.com/docs/5.4/csrf)等等。
![](https://img.kancloud.cn/1d/1e/1d1e54555ca319d5aaee750cec85661f_572x508.png)
**laravel请求生命周期流程图,如下**
![](https://img.kancloud.cn/92/26/922612cbdd637e1d8f8210b16558b445_1748x696.png)
- 消息队列
- 为什么要用消息队列
- 各种消息队列产品的对比
- 消息队列的优缺点
- 如何保证消息队列的高可用
- 如何保证消息不丢失
- 如何保证消息不会重复消费?如何保证消息的幂等性?
- 如何保证消息消费的顺序性?
- 基于MQ的分布式事务实现
- Beanstalk
- PHP
- 函数
- 基础
- 基础函数题
- OOP思想及原则
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收机制
- php-fpm相关
- 高级
- 设计模式
- 排序算法
- 正则
- OOP代码基础
- PHP运行原理
- zavl
- 网络协议new
- 一面
- TCP和UDP
- 常见状态码和代表的意义以及解决方式
- 网络分层和各层有啥协议
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 锁
- 索引
- 事务
- 高可用?高并发?集群?
- 其他
- 主从复制
- 主从复制数据延迟
- SQL的语⾔分类
- mysqlQuestions
- Redis
- redis-question
- redis为什么那么快
- redis的优缺点
- redis的数据类型和使用场景
- redis的数据持久化
- 过期策略和淘汰机制
- 缓存穿透、缓存击穿、缓存雪崩
- redis的事务
- redis的主从复制
- redis集群架构的理解
- redis的事件模型
- redis的数据类型、编码、数据结构
- Redis连接时的connect与pconnect的区别是什么?
- redis的分布式锁
- 缓存一致性问题
- redis变慢的原因
- 集群情况下,节点较少时数据分布不均匀怎么办?
- redis 和 memcached 的区别?
- 基本算法
- MysqlNew
- 索引new
- 事务new
- 锁new
- 日志new
- 主从复制new
- 树结构
- mysql其他问题
- 删除
- 主从配置
- 五种IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何实现手机扫码登录功能
- laravel框架的生命周期