php类方法在线性能测试

在两个月前一个群里的朋友问了一个问题,他说:“现在他们公司的项目有一个模块的性能在线表现非常差,很长时间没有查出问题所在,老板一怒之下让他把所有类方法的执行时间给记录进行分析,并且不能影响现在的项目性能。”老板让他记录这些信息是为了分析具体影响性能的地方在哪些地方,待项目运行一段时间就去除。这个需求导致两个个问题,第一是怎么监听这个模块所有类方法的执行时间,第二是怎么能在不影响现在项目性能的情况下完成(本身性能就很差了),下面我们就这两个问题来分析:

一、怎么监听这个模块所有类方法的执行时间

这个问题他第一个想到的是在所有类方法处理前加一段代码记录时间,在返回数据前进行计算运行时间,然后记录日志。这种方法一定是可行的,而且对性能的影响不是很大,但是…… 反正我不会这么干了,程序员都是懒惰的,而且都是很聪明的,我们不是码农,如果这么实施,那么要改动的代码量太大了,重复很久没有意义没有技术含量的工作,其次以后删除的时候又来一次,我会奔溃。当然位朋友也不会这么干,所以我才知道了这个奇葩的需求。

怎么解决呢,本来这么任务解决起来确实很费劲,我们可以借用__call()和__callStatic()对类方法进行重载,在php5.3以前静态方法只能自己一个个去加了,感谢php5.3新增了__callStatic()魔术方法。有人会问了这个两个魔术方法都是在类方法不存在的时候才有用,他们怎么能实现这个需求呢?这个问题等会看代码,下面分析第二个问题吧。

二、怎么能在不影响现在项目性能的情况下完成

为啥我说会有这个问题呢?之前分析需求的时候确实有,但是在回答第一个问题的时候已经说了解决方案,我认为采用__call()和__callStatic()对类方法进行重载,比较简单实现,且对现有项目性能影响很小。

我们在这个问题里主要讨论一些其它方法,其实实现性能分析的扩展也有很多,xdebug、xhprof等,都知道xdebug性能损耗很大,不适合在正式环境使用,xhprof性能损耗相对较小,可在正式环境使用。那为什么不用xhprof呢?有三点:1.性能损耗略大;2.日志记录格式不灵活,对日志的分析造成困扰;3.有些函数没法统计,而且会出现严重错误(如:call_user_func_array)

既然已经确定解决方案,我们就先看一个demo吧

/**
 * 类方法性能监听
 *
 * @author 戚银  [email protected]
 * @date	2015-05-31 22:09
 */
class demo {

	/**
	 * 普通类方法
	 *
	 * @access public
	 * @return void
	 */
	public function test1(){
		for($i=0; $i<100; ++$i){

		}
	}

	/**
	 * 静态方法
	 *
	 * @access public
	 * @return void
	 */
	public static function test2(){
		for($i=0; $i<100; ++$i){

		}
	}
}

看上面的demo类,其中有两个方法,一个普通方法,一个静态方法,我们业务层调用的方式如下:

<?php
(new demo())->test1();
demo::test2();

我们保证一个原则就是不改变类以外的代码,只调整该类来实现,下面我采用__call()和__callStatic()对类方法进行重载。

<?php
/**
 * 类方法性能监听
 *
 * @author 戚银  [email protected]
 * @date	2015-05-31 22:09
 */
class demo {

	/**
	 * 普通类方法
	 *
	 * @access public
	 * @return void
	 */
	public function _test1(){
		for($i=0; $i<100; ++$i){

		}
	}

	/**
	 * 静态方法
	 *
	 * @access public
	 * @return void
	 */
	public static function _test2(){
		for($i=0; $i<100; ++$i){

		}
	}

	/**
	 * 类魔术方法
	 *
	 * @access public
	 * @param string $name
	 * @param array	 $arguments
	 * @return mixed
	 */
	public function __call($name, $arguments){
		$startTime = microtime(true);
		$data = call_user_func_array(array($this, '_'.$name), $arguments);
		echo microtime(true) - $startTime;
		return $data;
	}

	/**
	 * 类魔术方法
	 *
	 * @access public
	 * @param string $name
	 * @param array	 $arguments
	 * @return mixed
	 */
	public static function __callStatic($name, $arguments){
		$startTime = microtime(true);
		$data = call_user_func_array(array(__CLASS__, '_'.$name), $arguments);
		echo microtime(true) - $startTime;
		return $data;
	}
}

在这段代码里面我们添加了__call()和__callStatic()方法,如果只添加这两个方法是没用的,因为之前业务层的代码没变,调用的方法是存在的,要使调用的方法不存在而且只改变类本身,就只能在方法名前加一个下划线(这个规则自己定),然后我们在调用这个两个方法发现输出了两个方法的执行时间。

这样实现也发现了几个问题,改动的代码还是很多,每个类都要加,很累…………,其实善用手边的工具很好实现,使用继承是个很好的方式,把这个两个方法写到一个基类里,然后所有类都这继承这个基类。类方法名替换,除了构造方法和析构方法,直接使用编辑器批量替换即可,以后改回来也是。

注意:如果使用继承方式实现,__callStatic()方法的__CLASS__需要调整。

这里以在类方法前增加下划线实现,使业务层找不到类方法,其实这个例子还可以调整方法可见性来实现,但是可见性实现的方式有以下弊端:

1.     调整后以后想调整回来很有可能弄错类方法可见性,不知道哪些方法调整了。

2.     调整可见性只对类公共方法有效,对受保护和私用的方法不可用

当然如果只记录类公共方法的性能,可以使用改变方法可见性实现,但一定记得在注视上添加标注该方法是改变过的,而且一定被把public改成private,因为如果有类继承这个类就没法访问这个方法了。

时间: 2024-10-07 19:26:32

php类方法在线性能测试的相关文章

云层天咨上海再下一棋,测试教育今年更上一楼

2016年7月24日之后,请广大软件测试从业人员再记住一个地址:上海市黄浦区中华路567号朝阳门大厦6D,这是云层天咨上海中心的所在地.在上个周末,碳烤一般的上海市区,这里格外的清凉,50多位各企业嘉宾和软件测试从业者慕名而来,共同见证云层天咨上海中心的开业典礼. 右起:陈霁(云层).鄢俊.朱佳杰(韬光养晦).方文庆 主要负责人 云层天咨创立于2014年8月18日,诞生于美丽的海岛城市鹭岛厦门,一晃两年要过去了.在众多企业和朋友的关照下,我们获得了长足的发展,开辟了性能测试精讲班.自动化测试精讲

JavaScript性能优化 DOM编程

最近在研读<高性能JavaScript>,在此做些简单记录.示例代码可在此处查看到. 一.DOM 1)DOM和JavaScript 文档对象模型(DOM)是一个独立于语言的,用于操作XML和HTML文档的程序接口(API). 浏览器通常会把DOM和JavaScript独立实现.例如Chrome中使用Webkit的WebCore库渲染页面,用V8作为JavaScript引擎. 访问DOM天生就慢,将DOM和JavaScript比喻为两个岛屿,两处同行要收过桥费,ECMAScript访问DOM的次

Web中的图标

随着时代的变迁与技术的不断的更新,在当今这个时代,Web中的图标(Icons)不再仅仅是局限于<img>.除了<img>直接调用Icons文件之外,还有Sprites(俗称雪碧图).Icon Font(字体图标).SVG Icon等等.今天我们就来一起探讨一下这些方法在Web中实现Icon的利弊. 思考变革 设计师不管分辨率(Resolution independent)和设备平台,其追求像素完美(Pixel Perfection).体验一致性:而前端工程师们更为关心的是页面的可访

架构设计之六个复杂度来源

之前在谈谈架构设计的目的 这篇文章中说过,架构设计的目的就是为了解决软件系统复杂度带来的问题. 但是究竟复杂度有哪些呢?所以今天借此说说软件复杂度的六个来源: 1.高性能; 2.高可用; 3.可扩展性; 4.低成本; 5.安全; 6.规模; 一.高性能 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力.例如计算机,从电子管计算机到晶体管计算机再到集成电路计算机,运算性能从每秒几次提升到每秒几亿次.但伴随着性能越来越高,相应的方法和系统复杂度也是越来越高.现代的计算机CPU集成了几亿颗晶体管

免费在线的web性能测试网站

由于需要测试网站并发,所以去百度搜了搜,最开始找了个webkaka结果告知,已下线,好像是个很好的在线网站.现在只有网站速度诊断的http://pagespeed.webkaka.com/ 不过单说测试速度性能,还是不错的 至于并发测试情况,找到个网址 http://www.oschina.net/news/21033/12-free-online-tools-for-website-testing/ 这上面有十二个在线web网址 其中一个今天试了试 Load Impacthttps://loa

基于场景的性能测试设计

“为了测试目的而设计的测试用例场景”主要根据测试设计人员的经验来进行,但是仍然要参 考用户的实际场景,用户实际使用场景是设计所有测试用例的依据.例如一些业务系统,虽然备份历史数据的周期为一年,但是设计大数据量测试用例时仍然包含了 系统运行一个月.半年等的数据量模拟测试,因为这些均属于用户的典型场景. 综合上面可以看出,性能测试用例设计首先要分析出用户现实中的典型场景,然后参照典型场景进行设计.实际项目中分析场景一般不会孤立的分析某一特定类型场景,而是把两种或者几种类型场景结合起来进行分析设计,这

性能测试指标

性能测试指标 通用指标(指Web应用服务器.数据库服务器必需测试项) Web服务器指标 数据库服务器性能指标 系统的瓶颈定义 稳定系统的资源状态 通俗理解: ·日访问量 ·常用页面最大并发数 ·同时在线人数 ·访问相应时间 案例:最近公司一个项目,是个门户网站,需要做性能测试,根据项目特点定出了主要测试项和测试方案: 一种是测试几个常用页面能接受的最大并发数(用户名参数化,设置集合点策略) 一种是测试服务器长时间压力下,用户能否正常操作(用户名参数化,迭代运行脚本) 一种则需要测试服务器能否接受

loadrunner实战篇 - 客户关系管理系统性能测试

系统介绍                                                             图1(客户关系管理系统模块关系图) 需求分析 一.性能指标 性能指标分析,根据客户需求与本系统相结合,用户希望模块能满足下表所列的性能指标. 图2(性能指标) 很明显,上面的需求是不具可操作性的,这就像和客户谈需求一样,客户只是很简单地描述了需求,而如果仅仅从上面这个简单的表格来进行性能测试,是很难的一件事情,并且很可能测试出来的结果与实际结果存在很大的差距,这样就需

转载:性能测试解惑之并发压力

声明:非原创文章,原创链接为http://www.cnblogs.com/pohome/articles/2073283.html. l 如何考察性能 这个问题相信很多同事都了然于心了,基本都有自己的理解,我们也很少接到不懂性能的反馈,但很多人甚至包括客户,都把响应时间或者并发用户作为衡量性能的惟一依据,支持10000并发?性能好!响应时间1秒?性能好!有些时候我们也会接到客户一些要求,让我们哭笑不得,某次一客户就要求我们的产品支持10000并发,有点汗,哈哈. 实际上性能是一项工程,严格地说,