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/

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
原生php实现列表接口+分页接口+排序接口组合使用+包括测试数据(不加任何封装)
|
8月前
|
PHP 数据库
对PHP源码的测试
对PHP源码的测试
|
9月前
|
JSON 监控 前端开发
Zabbix监控系统PHP-API开发测试实录
Zabbix监控系统PHP-API开发测试实录
142 0
|
9月前
|
PHP Windows
php环境部署:phpstudy设置本地测试域名找不到hosts文件的解决方案
php环境部署:phpstudy设置本地测试域名找不到hosts文件的解决方案
193 0
|
9月前
|
JavaScript 数据库连接 PHP
php部署服务器后本地测试正常的页面顶部出现空白的(&#65279 BOM头)解决方案
php部署服务器后本地测试正常的页面顶部出现空白的(&#65279 BOM头)解决方案
65 0
|
10月前
|
PHP
PHP递归和循环的速度测试
写了一个可以对 $_GET`, `$_POST 等输入进行过滤的函数,做了PHP递归和循环的速度测试。
55 0
|
Web App开发 jenkins 测试技术
web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架
web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架
147 0
|
测试技术 PHP
PHP: PhpStorm单元测试报错:PHPUnit Cannot open file
PHP: PhpStorm单元测试报错:PHPUnit Cannot open file
71 0
|
Java PHP
PHP:Phar的打包和使用
Phar包在概念上类似于Java的Jar包,但是根据PHP应用程序的需求和灵活性进行了定制,Phar包用于在单个文件中分发完整的PHP应用程序或者库(单一入口)。 使用Phar包和使用其他的PHP库是相同的: 加载文件 –> 调用
253 0
PHP:Phar的打包和使用