PHP效能最佳化第八期函數篇,include()與include_once()和require()與require_once()效能比較,主要是通過擷取這四個函數執行時間 比較效能差異,實驗採用Benchmark_Iterate類工具。
測試方法
載入一個已經存在的檔案exist.php,通過Benchmark_Iterate類調用50次,擷取各函數的執行時間並產生曲線圖。
測試代碼
代碼如下 |
複製代碼 |
require_once "Benchmark/Iterate.php"; $bench = new Benchmark_Iterate; function load_include(){ include 'exist.php'; } function load_require(){ require 'exist.php'; } function load_include_once(){ include_once 'exist.php'; } function load_require_once(){ require_once 'exist.php'; } $bench->run(50,"load_include"); //$bench->run(50,"load_require"); //$bench->run(50,"load_include_once"); //$bench->run(50,"load_require_once"); $result = $bench->get(); |
測試結果
1,使用include()函數負載檔案的執行時間
圖解:使 用include()函數負載檔案的平均執行時間為0.0013秒左右
2,使用include_once()函數負載檔案的執行時間
圖解:使用include_once()函數負載檔案的平均執行時間為0.0011-0.0012秒
3,使用require函數負載檔案的執行時間
圖解:使用require()函數負載檔案的平均執行時間為0.0012-0.0013秒
4,使用require_once()函數負載檔案的執行 時間
解:使用require_once()函數負載檔案的平均執行時間為0.0011-0.0012秒
由上面測試結果 可知,四個函數負載檔案的執行時間基本上差不多,區別在於,如果存在一個檔案多次載入的情況,include和require函數會載入多次,而 include_once和require_once函數只會載入一次。同時處理載入失敗的情況不同,include() 和include_once() 產生一個警告而 require() 和 require_once() 則導致一個致命錯誤。
相關說明
include()和require()函數
這兩種結構除了在如何處理失敗之外完全一樣。include() 產生一個警告而 require() 則導致一個致命錯誤。換句話說,如果想在遇到丟失檔案時停止處理頁面就用 require()。include() 就不是這樣,指令碼會繼續運行。同時也要確認設定了合適的 include_path。注意在 PHP 4.3.5 之前,包含檔案中的語法錯誤不會導致程式停止,但從此版本之後會。
尋找包含檔案的順序先是在當前工作目錄的相對的 include_path 下尋找,然後是當前運行指令碼所在目錄相對的 include_path 下尋找。例如 include_path 是 .,當前工作目錄是 /www/,指令碼中要 include 一個 include/a.php 並且在該檔案中有一句 include "b.php",則尋找 b.php 的順序先是 /www/,然後是 /www/include/。如果檔案名稱以 ./ 或者 ../ 開始,則只在當前工作目錄相對的 include_path 下尋找。
當一個檔案被包含時,其中所包含的代碼繼承了 include 所在行的變數範圍。從該處開始,調用檔案在該行處可用的任何變數在被調用的檔案中也都可用。不過所有在包含檔案中定義的函數和類都具有全域範圍。
include_once() 和require_once()函數
include_once() 和require_once()語句在指令碼執行期間包含並運行指定檔案。此行為和 include() 和require() 語句類似,唯一區別是如果該檔案中的代碼已經被包含了,則不會再次包含。如同此語句名字暗示的那樣,只會包含一次。 include_once() 和require_once()應該用於在指令碼執行期間同一個檔案有可能被包含超過一次的情況下,想確保它只被包含一次以避免函數重定義,變數重新賦值等問題。