1. 程式人生 > >PHP歸檔phar效能測試

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 V5.3中新特性,建立並使用Phar歸檔。http://www.ibm.com/developerworks/cn/opensource/os-php-5.3new4/
test-phar-performance-apc https://github.com/ralphschindler/test-phar-performance-apc/