在PHP的开发中,有时需要测试当前服务器所能承受的荷载,这通常就需要用到压力测试。性能测试侧重于代码,而压力测试侧重于服务器。
最常用最简单的压力测试工具就是Apache自带的ab工具。ab压力测试工具的使用方法很简单,功能也较弱,对HTTP请求进行压力和性能测试,除了ab外,还有一款更专业的工具JMeter。
JMeter是Apache的开源项目,使用Java编写,是一个功能强大的性能测试工具,可以对HTTP请求、FTP请求、数据库连接(使用JDBC)等进行测试,并且其HTTP测试的功能更强大,能够友好地支持GET/POST定制。
1. 使用JMeter压力测试HTTP
JMeter下载地址:
http://jmeter.apache.org/download_jmeter.cgi或
http://pan.baidu.com/s/1b6o9dk
在使用JMeter之前,需要确保你的电脑已经安装了Java(下载地址:
http://www.java.com/zh_CN/ 或
http://pan.baidu.com/s/1qYjHBn2)。
下载完JMeter的安装包后,直接解压,然后找到apache-jmeter-3.0\bin目录下的jmeter.bat文件,双击运行即可。
关于JMeter的几个术语:
线程组:测试里每个任务都需要线程处理,所有后来的任务必须在线程组下面创建。通过点击菜单栏的 编辑 -> 添加 -> Threads(Users) -> 线程组,来建立线程组,在线程组面板里有几个输入栏:线程数、Ramp up Period(in seconds)、循环次数,其中Ramp Up Period(in seconds)表示在这段时间内创建完所有的线程。例如有8个线程,Ramp Up=200秒,线程的启动时间间隔为 200/8=25秒,这样的好处是,一开始不会使服务器有太大的负载。
取样器(sampler):可以认为所有测试任务都由取样器承担,如:HTTP请求。
断言:对取样器返回的请求结果给出判断,判断其是否正确。
监听器:对取样器的请求结果进行显示,并统计一些数据(如吞吐量、KB/S等)。
具有的测试步骤,分为以下几步:
(1)建立测试计划
测试计划描述执行测试过程中JMeter的执行过程和步骤,完整的测试计划包括一个或者多个线程组(Thread Groups)、逻辑控制器(Logic Controller)、实例产生控制器(Sample Generating Controller)、监听器(Listener)、定时器(Timer)、断言(Assertions)等。
双击 jmeter.bat 文件,打开JMeter工具,此时,已经建立一个默认的测试计划,一个JMeter应用的实例只能建立一个测试计划。如下图:
现在开始填充一个测试计划的内容,这个测试计划向一个文件发出POST请求,需要JMeter模拟50个请求者(也就是50个线程),每个请求者(用户)连续请求4次。
新建一个待测试的脚本文件 test.php,内容如下:
$num = 3;
if(isset($_POST['num'])) $num = $_POST['num'];
$sum = 0;
for($i=0;$i<=$num;$i++) {
$sum+=$i;
}
echo $sum;
?>
(2)添加线程组
右击测试计划,在弹出的快捷菜单中依次选择 添加 -> Threads(Users) -> 线程组,按照测试计划依次填入以下参数,线程数为50,Ramp Up=0,循环次数=4。
(3)添加取样器
右击线程组,选择 添加 -> Sampler -> HTTP请求。在 Basic 选项卡处的Web服务器处,服务器名称设为 demo.com(域名和IP地址),端口设为 80,协议设为 http,路径设为 /jmeter/test.php,方法设为POST,然后填入在Parameters处,填入POST的参数名称和值。
(4)添加监听器
右击线程组,选择 添加 -> 监听器 -> 图形结果,然后再 添加 -> 监听器 -> Summary Report,再 添加 -> 监听器 -> 察看结果树。
最后,点击主菜单里的启动按钮即可。
现在,只需要查看监听器就可以看到测试结果。图形结果和Summary Report分别以图表和表格的形式,指出了样本数、吞吐率、偏离、中值等重要指标。
可以到 察看结果树 中,看测试的结果(如:HTTP响应的数据)是否符合预期。
根据代码得知,测试代码是一段求和的代码,当输入参数是100时,响应数据为5050,该结果符合预期。单击 察看结果树 中的 请求 选项卡,还能看到发送的请求数据。可以通过增加线程数以及传入参数的方式来测试不同条件下的负载。
JMeter的主要测试组件有以下几个:
测试计划:使用JMeter进行测试的起点,是其他JMeter测试元件的容器。
线程组:代表一定数量的并发用户数,用来模拟并发用户发送请求。实际请求内容在Sampler(取样器)中设置,它被线程组包含。
monitor:监听器。负责收集测试结果,同时设定结果显示的方式。
逻辑控制器:自定义JMeter发送请求的行为逻辑,与Sampler结合使用模拟复杂的请求序列。
断言:用来判断请求响应的结果是否如用户所期望的。可以隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效测试非常有用。
配置元件:维护Sampler需要的配置信息,根据实际需要修改请求的内容。
前置处理器和后置处理器:在请求之前或之后修改数据。前置处理器常用来修改请求的数据,后置处理器常用来处理响应的数据。
定时器:负责定义请求之间的延迟间隔。
为了方便下次使用,还可以保存当次的测试计划。
注意:压力测试结果的可靠性很大程度上依赖测试软件自身的性能。JMeter有Java开发,受限于JVM,自身内存消耗比较大,同时提供的压力不是很大。为了保证测试的准确性,需要把测试环境和被测试环境分开。如果需要更大的压力,应考虑使用CurlLoader。