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/

PHP归档phar性能測试的更多相关文章

  1. mongodb3.0 性能測试报告 一

    mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver   共6台 cpu:  单颗8核 ...

  2. Window平台搭建Redis分布式缓存集群 (一)server搭建及性能測试

    百度定义:Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对很多其它.包含string(字符串).list(链表).set(集合).zset(sort ...

  3. mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry &#39;xxx&#39; for key &#39;PRIMARY&#39;

    mysql主键设置成auto_increment时,进行并发性能測试出现主键反复Duplicate entry 'xxx' for key 'PRIMARY' 解决方法: 在my.cnf的[mysql ...

  4. 系统吞吐量、TPS(QPS)、用户并发量、性能測试概念和公式

    PS:以下是性能測试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...

  5. Linux 性能測试工具

    Linux 性能測试工具 linux performance 查看系统配置 查看CPU信息 lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64- ...

  6. LR杂记 - 性能測试指标及经常使用的监控工具

    监控指标 性能測试通常须要监控的指标包含: 1.serverLinux(包含CPU.Memory.Load.I/O). 2.数据库:1.Mysql 2.Oracle(缓存命中.索引.单条SQL性能.数 ...

  7. Redis源代码分析(十三)--- redis-benchmark性能測试

    今天讲的这个是用来给redis数据库做性能測试的,说到性能測试,感觉这必定是高大上的操作了.redis性能測试.測的究竟是哪方面的性能,怎样測试,通过什么指标反映此次測试的性能好坏呢.以下我通过源代码 ...

  8. 微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服

    微博达人硅谷之歌:Testin云測移动搜索性能測试非常是让人信服 2014/10/08 · Testin · 开发人员訪谈 2013年11月1日,谷歌运行董事长施密特(Eric Emerson Sch ...

  9. mongodb3.0 性能測试报告 二

    mongodb3.0 性能測试报告 一 mongodb3.0 性能測试报告 二 mongodb3.0 性能測试报告 三 測试环境: 服务器:X86 pcserver   共6台 cpu:  单颗8核 ...

随机推荐

  1. Flowplayer-一款免费的WEB视频播放器(转)

    Flowplayer 是一个开源(GPL 3的)WEB视频播放器.您可以将该播放器嵌入您的网页中,如果您是开发人员,您还可以自由定制和配置播放器相关参数以达到您要的播放效果.本文主要介绍Flowpla ...

  2. asp.net 正在加载/处理(兼容IE Chrome)

    正在加载分两种 一种是页面初始化效果,也就是数据读取前,这个时候需要用ajax先显示读取中数据,当ajax回调的时候,读取页面数据 一种是界面读取中效果,就是用div显示,当OnPreRenderCo ...

  3. 在 Java 8 中获取日期

    前言 前面一篇文章写了<SimpleDateFormat 如何安全的使用?>, 里面介绍了 SimpleDateFormat 如何处理日期/时间,以及如何保证线程安全,及其介绍了在 Jav ...

  4. HeadFirst jsp 08 无脚本JSP

    web页面设计人员真的必须懂 java ? web页面人员可以很快学习 EL 语言. 目前不知道 EL 应用前景如何, 但是我们香港系统没有使用 EL. include 指令 include指令告诉容 ...

  5. 数学 - SGU 118. Digital Root

    Digital Root Problem's Link Mean: 定义f(n)为n各位数字之和,如果n是各位数,则n个数根是f(n),否则为f(n)的数根. 现在给出n个Ai,求出A1*A2*…*A ...

  6. DTD与XML Schema都是XML文档。(选择1项)

    DTD与XML Schema都是XML文档.(选择1项) A.正确 B.不正确 解答:DTD不是XML文件, schema是XML文档

  7. VC++中CEdit控件实现回车换行

    1.通过回车Enter换行: 这里要有两个设置 <1>.将控件的属性设置为Mutilines->true; <2>.将控件的另一个属性设置为Want return-> ...

  8. 使用jq实现打印机的效果

    本例中使用的是jq和es6的语法,代码如下: html: <div id="box"> this is test <br/>  这是测试用的 </di ...

  9. Linux Kernel 4.7版本发布

    导读 在经历了长达一周的惬意假日时光,大神Linus Torvalds宣布面向所有GNU/Linux操作系统发布Linux Kernel 4.7.Linux 4.7内核的研发历经2个多月,自今年5月2 ...

  10. Android 按Menu弹出菜单

    \res\anim\menu_in.xml    资源文件(动画) <?xml version="1.0" encoding="UTF-8"?> & ...