以下由Laravel教學專欄為大家介紹Laravel的生命週期,希望對需要的朋友有幫助!
Laravel的生命週期
#世間萬物皆有生命週期,當我們使用任何工具時都需要理解它的工作原理,那麼用起來就會得心應手,應用開發也是如此。理解了它的原理,那麼使用起來就會游刃有餘。
在了解 Laravel 的生命週期前,我們先回顧一下PHP 的生命週期。
PHP 的生命週期
PHP 的運行模式
PHP兩種運行模式是WEB模式、 CLI模式。
生命週期
當我們請求一個php
檔案時,PHP 為了完成這次請求,會發生5個階段的生命週期切換:
模組初始化(MINIT),即呼叫php.ini
中所指明的擴充功能的初始化函數進行初始化工作,如mysql
擴充。
請求初始化(RINIT),即初始化為執行本次腳本所需的變數名稱和變數值內容的符號表,如 $_SESSION
變數。
執行該PHP腳本。
請求處理完成(Request Shutdown),依序呼叫各個模組的RSHUTDOWN
方法,對每個變數呼叫unset
函數,如unset $_SESSION
變數。
關閉模組(Module Shutdown) , PHP呼叫每個擴充功能的 MSHUTDOWN
方法,這是各個模組最後一次釋放記憶體的機會。這意味著沒有下一個請求了。
WEB模式和CLI(命令列)模式很相似,差異是:
1
和5
有可能只執行一次,下次請求到來時重複2-4
的生命週期,這樣就節省了系統模組初始化所帶來的開銷。 可以看出PHP生命週期是很對稱的。說了這麼多,就是為了定位Laravel運行在哪裡,沒錯,Laravel僅運行再第三個階段:
作用
理解這些,你就可以優化你的Laravel 程式碼,可以更深入的了解Laravel 的
singleton(單例)。至少你知道了,每一次請求結束,PHP 的變數都會
unset#,Laravel 的
singleton 只是在某一次請求過程中的
singleton;你在Laravel中的靜態變數也不能在多個請求之間共享,因為每個請求結束都會
unset。理解這些概念,是寫出高品質程式碼的第一步,也是最關鍵的一步。因此記住,PHP是一種腳本語言,所有的變數只會在這次請求中生效,下次請求時已被重置,而不像Java靜態變數擁有全域作用。
Laravel 的生命週期
概述
#Laravel 的生命週期從public\index.php開始,從
public\index.php結束。
public\index.php的全部原始碼,更具體可以分為四個步驟:
1. require __DIR__.'/../bootstrap/autoload.php'; 2. $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 3. $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); 4. $kernel->terminate($request, $response);
composer自動載入所需的類別
composer require的依賴。
请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。
我们不妨在详细一点:
class loader
就是加载初始化第三方依赖。
Container
并向容器注册核心组件,是从 bootstrap/app.php
脚本获取 Laravel 应用实例,
请求被发送到 HTTP
内核或 Console
内核,这取决于进入应用的请求类型。
取决于是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。
HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。
protected $bootstrappers = [ //注册系统环境配置 (.env) 'Illuminate\Foundation\Bootstrap\DetectEnvironment', //注册系统配置(config) 'Illuminate\Foundation\Bootstrap\LoadConfiguration', //注册日志配置 'Illuminate\Foundation\Bootstrap\ConfigureLogging', //注册异常处理 'Illuminate\Foundation\Bootstrap\HandleExceptions', //注册服务容器的门面,Facade 是个提供从容器访问对象的类。 'Illuminate\Foundation\Bootstrap\RegisterFacades', //注册服务提供者 'Illuminate\Foundation\Bootstrap\RegisterProviders', //注册服务提供者 `boot` 'Illuminate\Foundation\Bootstrap\BootProviders', ];
注意顺序:
Facades
先于ServiceProviders
,Facades
也是重点,后面说,这里简单提一下,注册Facades
就是注册config\app.php
中的aliases
数组,你使用的很多类,如Auth
,Cache
,DB
等等都是Facades
;而ServiceProviders
的register
方法永远先于boot
方法执行,以免产生boot
方法依赖某个实例而该实例还未注册的现象。
HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。
HTTP 内核的标志性方法 handle处理的逻辑相当简单:获取一个
Request
,返回一个Response
,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。
在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
传递给路由是通过 Pipeline
(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php
中的$middleware
数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode
中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。
然后遍历所有注册的路由,找到最先符合的第一个路由,经过它的路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。
所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。
以上是詳解Laravel的生命週期的詳細內容。更多資訊請關注PHP中文網其他相關文章!