PHP example 之性能调试和负载测试

2010-11-10
  • 1976
  • 0

PHP本身的速度已经相当快了。一般来说,速度的瓶颈是等待数据库查询执行完成与从远程URL中提取内容等。由于Web平台的特点,PHP等web脚本语言本身可能实现不了它应有的效率。也希望我们的宽带速率更高,价格更便宜。这也在速度优化过程中增加更多的不定因素和复杂性。下面就介绍如何测试和发现代码中存在的性能问题的技术。

项目开始前,思维里应该有最基本的优化习惯并合理利用。项目的后期优化的成本就非常高了,可能你会重构某些代码块。下面讨论一些平时可以避免影响效率的习惯和方法。欢迎您留言补充。

  • 功能相同的函数,谁的效率最高。个人经验,一般相同功能的函数,新版本的效率更高(注意你的PHP版本是否支持新函数)。
  • 滥用正则表达式(使用能满足需求的字符串函数代替正则表达式)。
  • 平时对字符串、数组、数据结构优化方面做些研究和积累,重在培养一种习惯。

需要说明一点,我们需要综合考虑函数在你的程序中被调用的次数、可读性、可维护性,如果只是为了省下微不足道的一小点时间,而增加了额外的复杂性就不值得了。

计算函数执行时间

[code lang="php"]

<?php

/*

*

* @return void

*/

//定义一个字符串

$str="netconcepts.cn";

//从这里开始计时

$start=microtime(true);

//要测试的函数

$md5=md5($str);

$endtime=microtime(true) - $start;

echo 'Md5函数执行时间:'.$endtime;

?>

[/code]

计算程序执行时间----PEAR Benchmark 模块

PEAR Benchmark 模块自带的模板文件timer_example.php

[code lang="php"]

<?php

/**

* Wait

*

* @param int $amount Amount to wait

*

* @return void

*/

require 'Benchmark/Timer.php';

function wait($amount)

{

for ($i=0; $i < $amount; $i++) {

for ($i=0; $i < 100; $i++) {

}

}

}

// Pass the param "true" to constructor to automatically display the results

$timer = new Benchmark_Timer();

$timer->start();

wait(10);

$timer->setMarker('Mark1');

echo "Elapsed time between Start and Mark1: " .

$timer->timeElapsed('Start', 'Mark1') . "n";

wait(50);

$timer->stop();

$timer->display();

?>

[/code]

timer01

图1-timer_example运行结果

设置几个记号

如果你想对程序进行粗略的分析,看看执行每条语句需要多长时间,可以试试下面的方法

[code lang="php"]

<?php

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

require 'Benchmark/Benchmark/timer.php';

$timer=& new Benchmark_timer(true);

$timer->start();

//此处可以设置一些代码

$timer->setMarker('setup');

//此处是更多的已执行代码

$timer->setMarker('middle');

//此处是更多其他代码

$timer->setMarker('done');

//最后一点代码

$timer->stop();

$timer->display();

?>

[/code]

调用setMarker()记录时间。display()方法用于输出记号列表、设置每个几号的时间以及从前一个记号经过的时间。

timer02

图2-设置记号后运行结果

计算函数执行多次的时间

其中Benckmark模块中也包含Benchmark_Iterate类,这个类可以用于记录一个单独函数执行多次的时间。

Advanced PHP Debugger(APD)或Xdebug

这两个扩展都在PECL知识库中,都是比较健壮的剖析代码应用程序。方便监控哪个部分程序最耗费时间。

网站压力测试

基准测试:模拟一台HTTP服务器每秒钟能够对单独一个URL响应多少次请求。最常用的工具是Apache HTTP服务器的基准测试工具--ab。

压力测试:能够中断你的Web应用程序的测试技术。

断点测试-能够识别并修复程序的弱点,或者判断是否需要购置硬件。当与代码剖析共同使用时,可以明确程序中的哪一部分优先剥离,这对大型网站性能优化有很大的帮助。推荐工具Siege,通过读取配置文件中的多个URL,按照顺序(或者随机)逐个运行,非常接近真实网站应用。当然也可以像ab一样,一次只测试一个URL。

PHP加速器

加速器原理是通过将PHP脚本编译后的操作码保存在磁盘或者内存中,以避免PHP根据每个请求反复把脚本编译成操作码。是不是感觉有点像编译语言啊,哈哈。有得有失,有利有弊。

一个请求到达服务器,通知PHP解释器运行特定的程序时,读取源码编译为内部操作码。当脚本执行完成时,解释器就会丢弃编译结果。这是典型的解释型语言。加速器的应用,就会将编译后的操作码保存起来,当下一次PHP解释器根据请求执行同一程序时,加速器就会介入并检查是否保存了该编译指令。有则不用再次编译直接用之,节省了时间。当然这里是灵活的,可以通过配置使得加速器根据不同的条件来更新编译结果,比如程序改变时或者按照时间再或者有需要强行更新。

常用的加速器:Alternative PHP Cache (APC) 、eAceelerator 、ionCoube PHP Accelerator (PHPA).

zend 官方出品 Zend Optimizer也是免费的,但他不是加速器。Zend Optimizer实现的原理是对那些在被最终执行之前由运行编译器(Run-Time Compiler)产生的代码进行优化。

在选择加速器时,加速器对应的php版本很重要。新版的PHP和过去的加速器,可能都没有必要,对吧!毕竟加速器只是优化的一个工具,这还要根据实际情况来选择。高兴的是,我们知道有这样的工具和解决问题的方法(思维)。剩下的就是我们出色的完成任务啦!

希望对大家有一个宏观的认识和理解。最后罗列出来参考文档,在需要的时候,可以深入学以致用。

PRAR Benchmark 类:http://pear.php.net/package/Benchmark

APD的文档 http://www.php.net/manual/en/ref.apd.php

Xdebug剖析和排错扩展 http://www.xdebug.org

DBG扩展资料 http://www.php-debugger.com/dbg/

Kcachegrind可视化剖析工具 http://kcachegrind.sourceforge.net/html/Home.html

Siege 文档 http://www.joedog.org/index/siege-home

ab 文档 http://httpd.apache.org/docs/2.0/programs/ab.html

torture.pl源码文档 http://stein.cshl.org/~lstein/torture/

欢迎跟大家交流!