在本節(jié)將簡單的介紹一下Joomla的整個執(zhí)行流程,介紹的重點包括但不限于包含的關鍵文件、調(diào)用的關鍵方法、觸發(fā)的觸發(fā)器等。如有不正確的地方,可以留言討論。
joomla是一個單入口CMS文件,一切的請求都從index.php文件開始。我們將嘗試介紹你輸入一個joomla網(wǎng)站的地址,到如何生成頁面的整個流程。
假設你輸入的地址是 http://www.zmax99.com/index.php 或者 http://www.zmax99.com/index.php?option=com_zmaxshop&view=item&id=1 或者 http://www.zmax99.com/articles/test.html
只要您的網(wǎng)站是基于joomla搭建的,那么它開始請求的文件都是網(wǎng)站根目錄下的index.php這個文件。
joomla執(zhí)行流程的時序圖

文字描述
當請求達到網(wǎng)站根目錄下的 index.php 時,一個全新的Joomla執(zhí)行周期開始了,其中包括:
導入定義文件包括定義應用程序常量的文件,這些文件在應用程序及其擴展中廣泛使用。
加載 Joomla 框架及其應用程序正常工作所需的所有基本類,框架還會檢查是否有存在configuration.php這個配置文件,如果不存在那么就會重定向到 安裝程序(installtion),開始安裝一個新的Joomla
創(chuàng)建JApplication 對象并且初始化,開始處理session狀態(tài)(如果存在,怎使用現(xiàn)有的session,如果不存在則新建一個session)。
加載configuration.php這個配置文件,在這個文件中記錄了數(shù)據(jù)庫的連接信息。
調(diào)用路由器,路由器負責將 URL 轉換為關聯(lián)的命令數(shù)組,反之亦然。這些命令數(shù)組將作為url參數(shù)發(fā)送到PHP的$_GET超全局變量中。在參數(shù)數(shù)組中有一個重要的變量是option.這個變量決定了系統(tǒng)將會執(zhí)行哪一個組件。
隨著組件的執(zhí)行,文檔對象被創(chuàng)建。文檔對象將需要展示的內(nèi)容存儲在內(nèi)存中,在輸出到瀏覽器之前,開發(fā)者可以依據(jù)需要動態(tài)的修改文檔中的數(shù)據(jù)(也就是頁面顯示的內(nèi)容)。系統(tǒng)會從數(shù)據(jù)庫中讀取中當前的模板設置,并且加載當前需要使用的模板。之后joomla將控制權完全交給組件,組件輸出什么完全由組件自己決定。
接下來是頁面的渲染,除了上一步的組件數(shù)據(jù),模塊和通知消息也被渲染并放置在它們在模板中定義的位置
最后一步是將頁面輸出到瀏覽器。
需要注意的是,在上述執(zhí)行周期的各個階段,都會調(diào)用插件事件點,從而允許各種事件干擾和擴展 Joomla 功能。
關鍵代碼描述
進入入口點文件index.php
初始化(Initialisation)
- 加載:defines.php
- 加載:framework.php修改魔術引號和 Zend 兼容性的配置選項檢查是否存在 configuration.php。不存在則重定向到安裝目錄的index.php(installation/index.php)加載: import.php加載: configuration.php設置PHP的錯誤報告模式初始化性能分析器(只有在檢查后臺設置了調(diào)試模式后啟用)導入 joomla.application.menu (菜單相關的類)導入 joomla.user.user導入 joomla.environment.uri導入 joomla.html.html導入 joomla.utilities.utility導入 joomla.event.event導入 joomla.event.dispatcher導入 joomla.language.language導入 joomla.utilities.string
- 性能分析器標記點:afterLoad
- 設置全局的$mainframe變量,調(diào)用 JFactory::getApplication('site')調(diào)用 JApplication::getInstance 創(chuàng)建并且返回一個實例.
- 調(diào)用 JSite::initialise 初始化應用程序application.
- 加載基礎的語言文件
- 調(diào)用 parent::initialise首先調(diào)用 JFactory::getUser (初始化用戶對象)導入 joomla.user.user調(diào)用 JFactory::getSession 創(chuàng)建會話.基于用戶的設置偏好加載編輯器
- 調(diào)用 JPluginHelper::importPlugin('system') 導入系統(tǒng)插件
- 性能分析器標記點: afterInitialise
- 觸發(fā)事件: onAfterInitialise
路由和認證(Routing and Authorisation)
- 路由 URI: 調(diào)用 JSite::route
- 調(diào)用 JSite::authorize檢查當前的菜單項的訪問級別. 如果未登錄,則重定向。如果已登錄且未授權,則停止
- 性能分析器標記點: afterRoute
- 觸發(fā)事件: onAfterRoute
調(diào)度(Dispatching)
- 調(diào)度組件: 調(diào)用 JSite::dispatch
- 性能分析器標記點: afterDispatch
- 觸發(fā)事件: onAfterDispatch
渲染(Rendering)
- 渲染頁面: 調(diào)用 JSite::render
- 性能分析器標記點: afterRender
- 觸發(fā)事件: onAfterRender
- 輸出: 調(diào)用 JResponse::toString (在這里可以設置是否壓縮)
更多建議: