Laravel 5.x 启动过程分析 [转]
1、初始化Application
1.1 注册基本绑定
- app -> Application实例(Illuminate\Foundation\Application)
- Illuminate\Container\Container -> Application实例(Illuminate\Foundation\Application)
1.2 注册基本服务提供者并启动
EventServieProvider —— 事件服务提供者
$this->app->singleton('events', function ($app) {
return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
return $app->make('Illuminate\Contracts\Queue\Factory');
});
});
RoutingServiceProvider —— 路由服务提供者
public function register()
{
$this->registerRouter();
$this->registerUrlGenerator();
$this->registerRedirector();
$this->registerPsrRequest();
$this->registerPsrResponse();
$this->registerResponseFactory();
}
更多详情查看源码:Illuminate\Routing\RoutingServiceProvider.php
1.3 注册核心服务容器别名
更多详情查看源码:Illuminate\Foundation\Application.php
第1026行registerCoreContainerAliases
方法。
1.4 设置根路径(如果传入的话)
if ($basePath) {
$this->setBasePath($basePath);
}
更多详情查看源码:Illuminate\Foundation\Application.php
第262行setBasePath
方法。
2、注册共享的Kernel和异常处理器
- Illuminate\Contracts\Http\Kernel -> App\Http\Kernel
- Illuminate\Contracts\Console\Kernel -> App\Console\Kernel
- Illuminate\Contracts\Debug\ExceptionHandler -> App\Exceptions\Handler
3、处理请求和响应
3.1 web请求
解析Illuminate\Contracts\Http\Kernel,实例化App\Http\Kernel
a.构造函数:设置$app/$router,初始化$router中middleware数值
b.handle处理请求 —— 经过路由发送请求:
- $request是经过Symfony封装的请求对象
- 注册request实例到容器 ($app[‘request’]->Illuminate\Http\Request)
- 清空之前容器中的request实例
- 调用
bootstrap
方法,启动一系列启动类的bootstrap方法:- Illuminate\Foundation\Bootstrap\DetectEnvironment 环境配置($app[‘env’])
- Illuminate\Foundation\Bootstrap\LoadConfiguration 基本配置($app[‘config’])
- Illuminate\Foundation\Bootstrap\ConfigureLogging 日志文件($app[‘log’])
- Illuminate\Foundation\Bootstrap\HandleExceptions 错误&异常处理
- Illuminate\Foundation\Bootstrap\RegisterFacades 清除已解析的Facade并重新启动,注册config文件中alias定义的所有Facade类到容器
- Illuminate\Foundation\Bootstrap\RegisterProviders 注册config中providers定义的所有Providers类到容器
- Illuminate\Foundation\Bootstrap\BootProviders 调用所有已注册Providers的boot方法
- 通过
Pipeline
发送请求,经过中间件,再由路由转发,最终返回响应new Pipeline($this->app))
->send($request)
->through($this->middleware)
->then($this->dispatchToRouter()
c.将响应信息发送到浏览器:
$response->send();
d.处理继承自TerminableMiddleware
接口的中间件(Session)并结束应用生命周期:
$kernel->terminate($request, $response);
Laravel 5.x 启动过程分析 [转]的更多相关文章
- Laravel 5.x 启动过程分析
Posted on 2015年9月11日 by 学院君 1.初始化Application 1.1 注册基本绑定 app -> Application实例(Illuminate\Foundat ...
- ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]
入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...
- 开机SystemServer到ActivityManagerService启动过程分析
开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...
- Neutron分析(2)——neutron-server启动过程分析
neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...
- linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)
回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...
- Activity启动过程分析
Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...
- Spark Streaming应用启动过程分析
本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...
- ActivityManagerService启动过程分析
之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了Activity ...
- Disconf源码分析之启动过程分析下(2)
接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...
随机推荐
- 错误C4146的解决方法
error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型: 那么什么情况下会遇见这种错误呢,例如下代码: 错误代码1:int number = -2147483648; //erro ...
- 关于搭建一个高性能网站的服务器的架设思路以及nginx测试的并发
对于高性能网站的架设,主要就是请求量大,那我们该如何进行支撑? 考虑到下面的几个方面: 1.要减少请求,那对于开发人员来说,网站的css文件进行合并,背景图片也要合并,一般都是请求一张比较大的图片,然 ...
- 数组中第K小的数字(Google面试题)
http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...
- nagios二次开发(四)---nagios监控原理和nagios架构简介
nagios监控原理 下面根据上面摘自网络的原理图对nagios的监控原理进行一下简单的说明: 1.nagios通过nsca进行被动监控.那么什么是被动监控呢?被动监测:就是指由被监测的服务器主动上传 ...
- Python全栈考试-部分试题(精选)
Python全栈考试(一) Python全栈考试(一) 1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py ...
- javascript 伪协议
[javascript 伪协议] 将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascrip ...
- oricle数据库关于定时
- Redis学习笔记-进阶
Redis持久化方案 redis有rdb和aof两种持久化方案 1)rdb方式 当符合一定条件时会自动将内存中的所有数据执行快照操作并存储到硬盘上 默认存储在redis根目录的dump.rdb文件中, ...
- javax/javaee-api/ Maven依赖
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artif ...
- 还是要好好研究开源的php
听说facebook是php写的,还是要静下心来好好研究一番的嘛,踏踏实实点点滴滴的做起来!加油