ThinkPHP原始碼分析系列 專案編譯機制

2021-09-01 12:13:08 字數 1998 閱讀 3856

核心編譯快取檔案中包含的檔案有三種不同的情況:如果使用者在自身的專案配置目錄中配置了core.php檔案,那麼~runtime.php中就包含core.php檔案中返回的檔案列表下的檔案;如果使用者設定了專案特定的執行模式,那麼~runtime.php中就包含該模式下所定義的核心檔案;除此之外,~runtime.php中包含的就是thinkphp預設的核心檔案,這些檔案由系統目錄下公共目錄下的core.php決定。

// 讀取核心編譯檔案列表

if(is_file(config_path.'core.php')) elseif(defined('think_mode')) else

// 系統預設的核心列表檔案

return array(

think_path.'/common/functions.php', // 系統函式庫

think_path.'/lib/think/core/think.class.php', // 系統核心類庫基類

think_path.'/lib/think/exception/thinkexception.class.php', // 異常處理類

think_path.'/lib/think/core/log.class.php', // 日誌處理類

think_path.'/lib/think/core/action.class.php', // 控制器類

//think_path.'/lib/think/core/model.class.php', // 模型類

think_path.'/lib/think/core/view.class.php', // 檢視類

think_path.'/common/alias.php', // 載入別名

);

同時,如果環境中php版本低於5.2.0,~runtime.php還會包含系統提供的相容函式庫compat.php, 更大的相容各種不同的環境。

為了更有效率的包含這些核心檔案,thinkphp採取了foreach遍歷載入檔案的方法。至此,已經可以執行乙個應用了。但是,這樣存在乙個問題,就是每次執行應用的時候,系統都會重複上面的操作,這將造成很大的i/o開銷,當訪問量達到一定數量後,伺服器將會不堪重負。為了解決這個問題,thinkphp提供了一種解決方案,就是使用編譯快取機制。具體實現是將核心檔案內容編譯到同乙個檔案中,這樣每次執行應用時,只需載入這個編譯快取檔案即可,這樣就極大地減少了i/o開銷,增強了應用程式的效能。

thinkphp專案編譯機制主要借助系統函式compile()完成,compile()函式位於系統函式庫中,其具體內容如下:

function compile($filename, $runtime=false)
可以看到,函式通過將檔案內容讀入到乙個字串,然後對字串進行了一些擷取處理,去掉了php的開始和結束標記。最後返回包含檔案內容的字串。

有了這個compile()函式,餘下就是呼叫這個函式處理核心檔案並將這些處理後得到的字串連線的過程。考慮到開發者在使用thinkphp進行開發會經歷開發除錯與部署兩種不同環境,thinkphp為開發者提供了兩種不同的編譯快取模式。一種是僅僅將核心檔案內容簡單的編譯在了乙個檔案中,這種模式方便開發者在開發過程中快速的進行錯誤定位。另一種模式則不僅僅是對檔案內容的簡單疊加,還去除了其中的注釋和空白進行,這種模式適合於部署環境,保證伺服器更快的響應。

if(!defined('no_cache_runtime')) 

$runtime = defined('think_mode')?'~'.strtolower(think_mode).'_runtime.php':'~runtime.php';

if(defined('strip_runtime_space') && strip_runtime_space == false ) else

unset($content);

}

這樣就生成了核心編譯快取檔案~runtime.php。

(完)

thinkphp 原始碼分析系列 三 多語言

thinkphp 支援多語言,一直對thinkphp 怎麼實現多語言比較好奇。這次來分析一下thinkphp 語言包 先是98行設定lang的預設語言,賦值為lang range 然後100行檢測是否開啟多語言自動檢測lant switch on,如果開啟的話,進行語言檢測 自動偵測設定獲取語言 可...

Redis原始碼分析系列

redis目前熱門nosql記憶體資料庫,量不是很大,本系列是本人閱讀redis原始碼時記錄的筆記,由於時間倉促和水平有限,文中難免會有錯誤之處,歡迎讀者指出,共同學習進步,本文使用的redis版本是2.8.19。redis之hash資料結構 redis之intset資料結構 redis之skipl...

jQuery原始碼分析系列

斷斷續續地看jquery原始碼,第一次萌生看jq原始碼的念頭,當時還是版本1.7.2,由於工作中沒有用到jq的機會,連 有幾種用法都還不知道,就開始啃原始碼,痛苦自然是少不了的,於是不久就放棄扔一邊了。等到工作中終於就機會用jq了 撒花 又萌生了啃jq原始碼的念頭,此時jq版本已經是2.0了。鑑於瀏...