最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解PHP的Yii框架的運(yùn)行機(jī)制及其路由功能

 更新時(shí)間:2016年03月17日 15:00:26   作者:柏樹(shù)_Jeff  
這篇文章主要介紹了PHP的Yii框架的運(yùn)行機(jī)制及其路由功能,Yii是一個(gè)基于組件的重量級(jí)的PHP框架,適合用來(lái)開(kāi)發(fā)大型網(wǎng)站,需要的朋友可以參考下

運(yùn)行機(jī)制概述
每一次 Yii 應(yīng)用開(kāi)始處理 HTTP 請(qǐng)求時(shí),它都會(huì)進(jìn)行一個(gè)近似的流程。

  • 用戶(hù)提交指向 入口腳本 web/index.php 的請(qǐng)求。
  • 入口腳本會(huì)加載 配置數(shù)組 并創(chuàng)建一個(gè) 應(yīng)用 實(shí)例用于處理該請(qǐng)求。
  • 應(yīng)用會(huì)通過(guò) request(請(qǐng)求) 應(yīng)用組件解析被請(qǐng)求的 路由。
  • 應(yīng)用創(chuàng)建一個(gè) controller(控制器) 實(shí)例具體處理請(qǐng)求。
  • 控制器會(huì)創(chuàng)建一個(gè) action(動(dòng)作) 實(shí)例并為該動(dòng)作執(zhí)行相關(guān)的 Filters(訪問(wèn)過(guò)濾器)。
  • 如果任何一個(gè)過(guò)濾器驗(yàn)證失敗,該動(dòng)作會(huì)被取消。
  • 如果全部的過(guò)濾器都通過(guò),該動(dòng)作就會(huì)被執(zhí)行。
  • 動(dòng)作會(huì)加載一個(gè)數(shù)據(jù)模型,一般是從數(shù)據(jù)庫(kù)中加載。
  • 動(dòng)作會(huì)渲染一個(gè) View(視圖),并為其提供所需的數(shù)據(jù)模型。
  • 渲染得到的結(jié)果會(huì)返回給 response(響應(yīng)) 應(yīng)用組件。
  • 響應(yīng)組件會(huì)把渲染結(jié)果發(fā)回給用戶(hù)的瀏覽器。

下面的示意圖展示了應(yīng)用是如何處理一個(gè)請(qǐng)求的。

2016317145658183.png (1144×876)

啟動(dòng)引導(dǎo)(Bootstrapping)
啟動(dòng)引導(dǎo)是指:在應(yīng)用開(kāi)始解析并處理新接受請(qǐng)求之前,一個(gè)預(yù)先準(zhǔn)備環(huán)境的過(guò)程。啟動(dòng)引導(dǎo)會(huì)在兩個(gè)地方具體進(jìn)行:入口腳本(Entry Script) 和 應(yīng)用主體(application)。

在入口腳本里,需注冊(cè)各個(gè)類(lèi)庫(kù)的類(lèi)文件自動(dòng)加載器(Class Autoloader,簡(jiǎn)稱(chēng)自動(dòng)加載器)。這主要包括通過(guò)其 autoload.php 文件加載的 Composer 自動(dòng)加載器,以及通過(guò) Yii 類(lèi)加載的 Yii 自動(dòng)加載器。之后,入口腳本會(huì)加載應(yīng)用的 配置(configuration) 并創(chuàng)建一個(gè) 應(yīng)用主體 的實(shí)例。

在應(yīng)用主體的構(gòu)造函數(shù)中,會(huì)執(zhí)行以下引導(dǎo)工作:

  • 調(diào)用 yii\base\Application::preInit()(預(yù)初始化)方法,配置一些高優(yōu)先級(jí)的應(yīng)用屬性,比如 yii\base\Application::basePath 屬性。
  • 注冊(cè)yii\base\Application::errorHandler。
  • 通過(guò)給定的應(yīng)用配置初始化應(yīng)用的各屬性。
  • 通過(guò)調(diào)用 yii\base\Application::init()(初始化)方法,它會(huì)順次調(diào)用 yii\base\Application::bootstrap() 從而運(yùn)行引導(dǎo)組件。
  • 加載擴(kuò)展清單文件(extension manifest file) vendor/yiisoft/extensions.php。
  • 創(chuàng)建并運(yùn)行各個(gè)擴(kuò)展聲明的 引導(dǎo)組件(bootstrap components)。
  • 創(chuàng)建并運(yùn)行各個(gè) 應(yīng)用組件 以及在應(yīng)用的 Bootstrap 屬性中聲明的各個(gè) 模塊(modules)組件(如果有)。

因?yàn)橐龑?dǎo)工作必須在處理每一次請(qǐng)求之前都進(jìn)行一遍,因此讓該過(guò)程盡可能輕量化就異常重要,請(qǐng)盡可能地優(yōu)化這一步驟。

請(qǐng)盡量不要注冊(cè)太多引導(dǎo)組件。只有他需要在 HTTP 請(qǐng)求處理的全部生命周期中都作用時(shí)才需要使用它。舉一個(gè)用到它的范例:一個(gè)模塊需要注冊(cè)額外的 URL 解析規(guī)則,就應(yīng)該把它列在應(yīng)用的 bootstrap 屬性之中,這樣該 URL 解析規(guī)則才能在解析請(qǐng)求之前生效。(譯注:換言之,為了性能需要,除了 URL 解析等少量操作之外,絕大多數(shù)組件都應(yīng)該按需加載,而不是都放在引導(dǎo)過(guò)程中。)

在生產(chǎn)環(huán)境中,可以開(kāi)啟字節(jié)碼緩存,比如 APC,來(lái)進(jìn)一步最小化加載和解析 PHP 文件所需的時(shí)間。

一些大型應(yīng)用都包含有非常復(fù)雜的應(yīng)用配置,它們會(huì)被分割到許多更小的配置文件中。此時(shí),可以考慮將整個(gè)配置數(shù)組緩存起來(lái),并在入口腳本創(chuàng)建應(yīng)用實(shí)例之前直接從緩存中加載。


yii的入口文件
這里使用了一個(gè)第三方的配置管理插件:marcovwout,來(lái)管理Yii的配置,細(xì)節(jié)我就不說(shuō)了。剩下的就是就是一些基本的全局變量設(shè)置了。往Yii::createWebApplication里面?zhèn)魅肱渲玫臄?shù)組,然后調(diào)用run方法,一個(gè)web應(yīng)用是不是就這么跑起來(lái)了,是的,抽象到最高層就是這樣:我往一個(gè)容器里面?zhèn)魅雽?duì)應(yīng)的配置,然后這個(gè)應(yīng)用可以基于該配置正常運(yùn)行起來(lái)。
說(shuō)YiiBase中的兩個(gè)比較重要的方法 (import,autoload)

2016317145740223.png (561×219)

這里使用了一個(gè)第三方的配置管理插件:marcovwout,來(lái)管理Yii的配置,細(xì)節(jié)我就不說(shuō)了。剩下的就是就是一些基本的全局變量設(shè)置了。往Yii::createWebApplication里面?zhèn)魅肱渲玫臄?shù)組,然后調(diào)用run方法,一個(gè)web應(yīng)用是不是就這么跑起來(lái)了,是的,抽象到最高層就是這樣:我往一個(gè)容器里面?zhèn)魅雽?duì)應(yīng)的配置,然后這個(gè)應(yīng)用可以基于該配置正常運(yùn)行起來(lái)。

路由
當(dāng)入口腳本在調(diào)用 yii\web\Application::run() 方法時(shí),它進(jìn)行的第一個(gè)操作就是解析輸入的請(qǐng)求,然后實(shí)例化對(duì)應(yīng)的控制器操作處理這個(gè)請(qǐng)求。該過(guò)程就被稱(chēng)為引導(dǎo)路由(routing)。(譯注:中文里既是動(dòng)詞也是名詞)

解析路由

路由引導(dǎo)的第一步,是把傳入請(qǐng)求解析為一個(gè)路由。如我們?cè)?控制器(Controllers) 章節(jié)中所描述的那樣,路由是一個(gè)用于定位控制器操作的地址。這個(gè)過(guò)程通過(guò) request 應(yīng)用組件的 yii\web\Request::resolve() 方法實(shí)現(xiàn),該方法會(huì)調(diào)用 URL 管理器 進(jìn)行實(shí)質(zhì)上的請(qǐng)求解析工作。

默認(rèn)情況下,傳入請(qǐng)求會(huì)包含一個(gè)名為 r 的 GET 參數(shù),它的值即被視為路由。但是如果啟用 yii\web\UrlManager::enablePrettyUrl,那么在確定請(qǐng)求的路由時(shí),就會(huì)進(jìn)行更多處理。具體的細(xì)節(jié)請(qǐng)參考 URL 的解析與生成 章節(jié)。

假使某路由最終實(shí)在無(wú)法被確定,那么 request 組件會(huì)拋出 yii\web\NotFoundHttpException 異常(譯注:大名鼎鼎的 404)。

缺省路由

如果傳入請(qǐng)求并沒(méi)有提供一個(gè)具體的路由,(一般這種情況多為于對(duì)首頁(yè)的請(qǐng)求)此時(shí)就會(huì)啟用由 yii\web\Application::defaultRoute 屬性所指定的缺省路由。該屬性的默認(rèn)值為 site/index,它指向 site 控制器的 index 操作。你可以像這樣在應(yīng)用配置中調(diào)整該屬性的值:

return [
  // ...
  'defaultRoute' => 'main/index',
];

catchAll 路由(全攔截路由)

有時(shí)候,你會(huì)想要將你的 Web 應(yīng)用臨時(shí)調(diào)整到維護(hù)模式,所有的請(qǐng)求下都會(huì)顯示相同的信息頁(yè)。當(dāng)然,要實(shí)現(xiàn)這一點(diǎn)有很多種方法。這里面最簡(jiǎn)單快捷的方法就是在應(yīng)用配置中設(shè)置下 yii\web\Application::catchAll 屬性:

return [
  // ...
  'catchAll' => ['site/offline'],
];

catchAll 屬性需要傳入一個(gè)數(shù)組做參數(shù),該數(shù)組的第一個(gè)元素為路由,剩下的元素會(huì)(以名值對(duì)的形式)指定綁定于該操作的各個(gè)參數(shù)。

當(dāng)設(shè)置了 catchAll 屬性時(shí),它會(huì)替換掉所有從輸入的請(qǐng)求中解析出來(lái)的路由。如果是上文的這種設(shè)置,用于處理所有傳入請(qǐng)求的操作都會(huì)是相同的 site/offline。

創(chuàng)建操作

一旦請(qǐng)求路由被確定了,緊接著的步驟就是創(chuàng)建一個(gè)“操作(action)”對(duì)象,用以響應(yīng)該路由。

路由可以用里面的斜杠分割成多個(gè)組成片段,舉個(gè)栗子,site/index 可以分解為 site 和 index 兩部分。每個(gè)片段都是指向某一模塊(Module)、控制器(Controller)或操作(action)的 ID。

從路由的首個(gè)片段開(kāi)始,應(yīng)用會(huì)經(jīng)過(guò)以下流程依次創(chuàng)建模塊(如果有),控制器,以及操作:

  • 設(shè)置應(yīng)用主體為當(dāng)前模塊。
  • 檢查當(dāng)前模塊的 yii\base\Module::controllerMap 是否包含當(dāng)前 ID。如果是,會(huì)根據(jù)該表中的配置創(chuàng)建一個(gè)控制器對(duì)象,然后跳到步驟五執(zhí)行該路由的后續(xù)片段。
  • 檢查該 ID 是否指向當(dāng)前模塊中 yii\base\Module::modules 屬性里的模塊列表中的一個(gè)模塊。如果是,會(huì)根據(jù)該模塊表中的配置創(chuàng)建一個(gè)模塊對(duì)象,然后會(huì)以新創(chuàng)建的模塊為環(huán)境,跳回步驟二解析下一段路由。
  • 將該 ID 視為控制器 ID,并創(chuàng)建控制器對(duì)象。用下個(gè)步驟解析路由里剩下的片段。
  • 控制器會(huì)在他的 yii\base\Controller::actions()里搜索當(dāng)前 ID。如果找得到,它會(huì)根據(jù)該映射表中的配置創(chuàng)建一個(gè)操作對(duì)象;反之,控制器則會(huì)嘗試創(chuàng)建一個(gè)與該 ID 相對(duì)應(yīng),由某個(gè) action 方法所定義的行內(nèi)操作(inline action)。

在上面的步驟里,如果有任何錯(cuò)誤發(fā)生,都會(huì)拋出 yii\web\NotFoundHttpException,指出路由引導(dǎo)的過(guò)程失敗了。

相關(guān)文章

  • PHP多進(jìn)程編程實(shí)例詳解

    PHP多進(jìn)程編程實(shí)例詳解

    這篇文章主要介紹了PHP多進(jìn)程編程方法,較為詳細(xì)的分析了PHP多進(jìn)程編程的概念、用法、相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2017-07-07
  • php快速導(dǎo)入大量數(shù)據(jù)的實(shí)例方法

    php快速導(dǎo)入大量數(shù)據(jù)的實(shí)例方法

    在本篇文章里小編給大家分享的是關(guān)于php如何快速導(dǎo)入大量數(shù)據(jù)的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-09-09
  • 淺析PHP安裝擴(kuò)展mcrypt以及相關(guān)依賴(lài)項(xiàng)(PHP安裝PECL擴(kuò)展的方法)

    淺析PHP安裝擴(kuò)展mcrypt以及相關(guān)依賴(lài)項(xiàng)(PHP安裝PECL擴(kuò)展的方法)

    本篇文章是對(duì)PHP安裝擴(kuò)展mcrypt以及相關(guān)依賴(lài)項(xiàng)(PHP安裝PECL擴(kuò)展的方法)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • PHP文件上傳操作實(shí)例詳解

    PHP文件上傳操作實(shí)例詳解

    這篇文章主要介紹了PHP文件上傳操作,結(jié)合實(shí)例形式詳細(xì)分析了php文件傳輸操作的實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-09-09
  • PHP實(shí)現(xiàn)機(jī)器學(xué)習(xí)之樸素貝葉斯算法詳解

    PHP實(shí)現(xiàn)機(jī)器學(xué)習(xí)之樸素貝葉斯算法詳解

    這篇文章主要介紹了PHP實(shí)現(xiàn)機(jī)器學(xué)習(xí)之樸素貝葉斯算法,結(jié)合實(shí)例形式詳細(xì)分析了樸素貝葉斯算法的概念、原理及php實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-12-12
  • PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之多態(tài)性的應(yīng)用示例

    PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之多態(tài)性的應(yīng)用示例

    這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之多態(tài)性的應(yīng)用,結(jié)合具體實(shí)例形式分析了php面向?qū)ο蟪绦蛟O(shè)計(jì)中關(guān)于多態(tài)性的概念、原理、相關(guān)使用技巧及注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • php Exception異常處理詳解

    php Exception異常處理詳解

    異常經(jīng)常被用來(lái)處理一些在程序正常執(zhí)行中遇到的各種類(lèi)型的錯(cuò)誤。比如做數(shù)據(jù)庫(kù)鏈接時(shí),你就要處理數(shù)據(jù)庫(kù)連接失敗的情況。使用異??梢蕴岣呶覀兂绦虻娜蒎e(cuò)特性,從而使我們的應(yīng)用程序更加的穩(wěn)定和健壯
    2022-11-11
  • 基于php+redis實(shí)現(xiàn)布隆過(guò)濾器

    基于php+redis實(shí)現(xiàn)布隆過(guò)濾器

    布隆過(guò)濾器(Bloom filter)是一種用于快速判斷一個(gè)元素是否存在于集合中的數(shù)據(jù)結(jié)構(gòu),它可以有效地檢索數(shù)據(jù),而不需要存儲(chǔ)實(shí)際的元素本身,本文給大家介紹了如何基于php+redis實(shí)現(xiàn)布隆過(guò)濾器,感興趣的朋友可以參考下
    2023-12-12
  • Json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法

    Json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法

    json_encode通常會(huì)把json中的漢字轉(zhuǎn)義成unicode,但是有些時(shí)候不是我們想要的,下面小編給大家介紹json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法,需要的朋友參考下吧
    2016-02-02
  • PHP屏蔽錯(cuò)誤的方法總結(jié)

    PHP屏蔽錯(cuò)誤的方法總結(jié)

    在本篇文章里小編給大家整理分享的是一篇關(guān)于PHP屏蔽錯(cuò)誤的方法總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-06-06

最新評(píng)論

光泽县| 广河县| 东莞市| 石楼县| 宁安市| 新郑市| 柳江县| 乌鲁木齐县| 渭源县| 杨浦区| 东辽县| 万安县| 巴马| 宜川县| 舞阳县| 泸溪县| 石河子市| 邛崃市| 萨嘎县| 阳新县| 安平县| 中宁县| 上思县| 丰城市| 师宗县| 沙田区| 富蕴县| 平凉市| 高州市| 桐庐县| 渭源县| 西安市| 郯城县| 临海市| 田阳县| 宜宾县| 武穴市| 宜州市| 雷波县| 凉山| 双鸭山市|