php生命周期
- 运行模式
- CLI模式
在终端输入php命令时使用的就是CLI模式 - WEB模式
当使用nginx或者其他web服务器作为宿主机处理请求时,使用的就是WEB模式
- CLI模式
- 生命周期
- 模块初始化:调用php.ini中指明的扩展的初始化函数进行初始化工作,如mysql扩展
- 请求初始化:初始化脚本中所需要的变量名和变量值内容的符号表,如$_SESSION变量
- 执行php脚本
- 请求处理完成:按顺序调用各个模块的request shutdown方法,对每个变量调用unset方法
- 关闭模块:php调用每个模块的module shutdown方法,这是各个模块最后一次释放内存的机会
- WEB模式和CLI模式的区别
- CLI模式会在每次脚本执行经历5个完整的生命周期
- WEB模式为了应对高并发,可能采用多线程,所以,可能1,5只执行一次,而2~4执行多次,以节省系统模块初始化带来的开销
- 总结
理解这些,你就可以优化你的 Laravel 代码,可以更加深入的了解 Laravel 的singleton(单例)。至少你知道了,每一次请求结束,PHP 的变量都会 unset,Laravel 的 singleton 只是在某一次请求过程中的singleton;你在 Laravel 中的静态变量也不能在多个请求之间共享,因为每一次请求结束都会 unset。理解这些概念,是写高质量代码的第一步,也是最关键的一步。因此记住,PHP是一种脚本语言,所有的变量只会在这一次请求中生效,下次请求之时已被重置,而不像Java静态变量拥有全局作用。
laravel生命周期
生命周期
文件载入composer生成的自动加载设置,包括所有你 composer require的依赖。
1
require __DIR__.'/../bootstrap/autoload.php';
注册绑定服务,实例化Application,并绑定HttpKernel,ConsoleKernel ,ExceptionHandler
1
$app = require_once __DIR__.'/../bootstrap/app.php';
将请求分发到路由,处理请求,生成并发送响应(毫不夸张的说,你99%的代码都运行在这个小小的handle 方法里面)
但是,请求是如何分发到路由的呢?具体而言就是,请求的分发是通过管道(Pipeline)实现的,而管道中有墙的阻碍。没错,墙就是中间件。
请求需要首先经过全局中间件的审核,成功后才会分发到路由;分发到路由后,还要经过路由中间件的审核,然后请求才会被路由引导向控制器或闭包函数。1
2
3
4
5$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();请求结束,进行回调(还记得可终止中间件吗?没错,就是在这里回调的)
1
$kernel->terminate($request, $response);
阅读本文后,建议阅读laravel框架启动过程