這篇文章主要介紹了關於PHP歸檔phar的性能測試,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
PHP自從5.3後新增PHAR歸檔, Phar 歸檔的概念來自Java™ 技術的JAR 歸檔,它允許使用單個文件打包應用程序,這個文件包含運行應用程式所需的所有東西。該文件不同於單一可執行文件,後者通常由程式語言生成,例如 C,因為該文件實際上是歸檔文件而非編譯過的應用程式。因此 JAR 文件實際上包含組成應用程式的文件,但是考慮到安全性,不會仔細區分這些文件。 Phar 擴充正是基於類似的理念,但在設計時主要針對 PHP 的 Web 環境。同樣,與 JAR 歸檔不同的是,Phar 歸檔可由 PHP 本身處理,因此不需要使用額外的工具來建立或使用。 Phar 擴充對 PHP 來說並不是一個新鮮的概念。它最初使用 PHP 編寫並被命名為 PHP_Archive,然後在 2005 年被添加到 PEAR 庫。然而在實際中,解決這一問題的純 PHP 解決方案非常緩慢,因此 2007 年重新編寫為純 C 語言擴展,同時添加了使用 SPL 的 ArrayAccess 物件遍歷 Phar 歸檔的支援。自那時起,人們做了大量工作來改善 Phar 歸檔的性能,目前對Phar使用非常有限,而關於Phar的性能測試很少,到底Phar性能如何,通過一個簡單實驗檢驗。
測試環境:
PHP:5.5.10
CPU:2GHz intel core i7
Mem:8GB
系統:Darwin 13.1.0
主要測試點:
1: Phar載入速度
1.1:檔案大小多少的影響?
1.2: include/require的影響?
1.3:Phar 存根(Stub)內容的影響?
2:Phar程式碼執行速度
2.1 全域函數比較
2.2 類別物件
2.3 類別方法
為了保證盡量保證測試準確,每種方式運行3次,去3次的平均值。同時作為對比,我們會直接採用程式碼方式,以獲得基準數據。
Phar 檔案主要包含檔案
phar-builder.php用於產生phar文件,執行test指令前,先執行此檔案產生phar-test.phar文件。
test_load.php 測試載入phar檔案速度
src目錄內包含檔案index.php檔案是存根文件,包含dates.php,for.php,functions.php,dates測試檔案類別方法,for.php測試物件方法,functions.php測試函數方法。
具體附件程式碼。
第一:phar載入速度,採用include和require方式測試發現差異不大,只採用require方式。
$stime = microtime(true); require './phar-test.phar'; $etime = microtime(true); $total = $etime - $stime; echo "phar total:".$total."s";
執行後,效率如下
localhost:phar ugg$ php test_phar_load.php phar total:0.0044760704040527s localhost:phar ugg$ php test_phar_load.php phar total:0.0051448345184326s localhost:phar ugg$ php test_phar_load.php phar total:0.0043849945068359s localhost:phar ugg$ vim test_phar_load.php
#平均載入4.7毫秒
$stime = microtime(true); require './src/index.php'; $etime = microtime(true); $total = $etime - $stime; echo "src total:".$total."s\n";執行後,效率如下
localhost:phar ugg$ php test_src_load.phpsrc total:0.0026230812072754s localhost:phar ugg$ php test_src_load.phpsrc total:0.0026969909667969s localhost:phar ugg$ php test_src_load.phpsrc total:0.0025439262390137s
#平均載入2.6毫秒結論:透過載入速度對比,phar載入方式比直接檔案載入方式慢了不少,幾乎直接引用文件所耗時間的兩倍。同時我又在phar檔案中載入一些幹擾文件,讓phar檔案變大,發現在10k以內,這個load時間變化不大。當然我並沒有把新增的檔案放到存根內,這樣做的目的,對於超過10K的目錄,檔案組織方式比如是autoload方式,而不會透過一個檔案包含所有的檔案。 phar加載時間是src直接加載的1.8倍左右。
第二:執行速度檢定phar方式,程式碼如下
#
$stime = microtime(true); //require 'phar://phar-test.phar'; require 'phar-test.phar'; $sstime = microtime(true); for($i = 0; $i<10000; ++$i){ $date = dates::next_week(); $for = new fortest(); $i = $for->for1to10000(); $number = number2Chinese('12345'); } $eetime = microtime(true); $etime = microtime(true); $total = $etime - $stime; $total2 = $eetime - $sstime; echo "phar load total:".$total."s\n"; echo "phar execution 10000 total:".$total2."s";執行效率如下
localhost:phar ugg$ php test_phar_functions.php phar load total:0.0047600269317627s phar execution 10000 total:0.00017499923706055s localhost:phar ugg$ php test_phar_functions.php phar load total:0.004863977432251s phar execution 10000 total:0.00017404556274414s localhost:phar ugg$ php test_phar_functions.php phar load total:0.004680871963501s phar execution 10000 total:0.00016689300537109s執行10000次的類別方法,物件實例和物件方法,以及函數方法,總共時間消耗為0.17毫秒。
src執行效率
localhost:phar ugg$ php test_src_functions.php phar load total:0.0029089450836182s phar execution 10000 total:0.00019693374633789s localhost:phar ugg$ php test_src_functions.php phar load total:0.0028579235076904s phar execution 10000 total:0.0002140998840332s localhost:phar ugg$ php test_src_functions.php phar load total:0.0029168128967285s phar execution 10000 total:0.00019478797912598s
執行10000次的類別方法,物件實例和物件方法,以及函數方法,總共時間消耗為0.20毫秒。 小結:透過執行速度對比,發現是phar方式,執行速度,要比直接文件include方式,快了(0.20-0.17)/0.20*100=15%,phar方式執行速度快的具體原因沒有找到,網路上有份資料,apc include_path設定phar執行速度很快。 https://github.com/ralphschindler/test-phar-performance-apc/。
總結:PHP歸檔phar方式,載入速度要慢於正常檔案包含方式,但是執行速度要高於檔案包含方式,如果配合include_path設定和APC或OP方式,優化phar歸檔的載入速度,就能提升php的執行速度。下一步會做方面的嘗試,1:建立大phar文件,實驗載入速度,執行速度。 2:了解phar載入原理和執行原理,3:套件概念管理和依賴。
以上是PHP歸檔phar的效能測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!