很多人都在Windows平台用IIS来跑PHP环境。如果在网络上检索一下的话,就会发现,目前IIS+PHP环境有3种方法。
1、CGI方式加载PHP环境,通常就是IIS里面配置解释器为php.exe,早期比较常见,目前使用较少。
特点是:稳定,但效率太低。2、ISAPI方式加载PHP环境,通常就是IIS里面配置解释器为php5isapi.dll,目前使用最多,应用最广。
特点是:多线程,效率较高,但不够稳定。3、FastCGI方式加载PHP环境,在IIS环境里并不常见,但其它系统环境应用还是有的,不过IIS7.0开始内置FastCGI了。
特点是:高效率,高稳定性,属于将来发展趋势。
今天我给大家介绍的是第三种,也就是最不常见的
IIS6.0以FastCGI模式加载php环境。据说相同配置下FastCGI方式加载PHP比ISAPI方式加载PHP性能提高很多,今天我的重点就放在
IIS6.0以FastCGI模式加载php环境的测试,看看究竟性能是不是提升了。当然我的理由也很充分,我没有足够好的服务器,所以我要榨干服务器的资源,如果确实FastCGI的性能更好,那我就赚了:)
什么是FastCGI
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI的工作原理是
1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)。
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
按补天大鱼的话说:因为进程在创建的时候CPU时间片、内存调度、IO访问消耗最多,所以FastCGI类似于常用的池技术。即预先创建好进程,等待请求。执行完成后,进程并不结束,而是返回池中。不过,按道理,这些进程执行到一定次数后,也会全部销毁再重新建立一次。
一、IIS6.0以isapi方式加载php环境并测试
我准备了一个phpinfo的页面,保存成abu.php<?php
phpinfo();
?>
注意看我标注出来的,Server API ISAPI表明目前服务器是IIS+ISAPI方式加载的PHP环境。
下面进行最简单的压力测试:
我用apache里面内置的ab.exe进行最简单的压力测试:
ab -n 1000 -c 20 http://192.168.0.6/abu.php
这句话的意思是模拟出总共1000个网站请求,并发20个请求,访问服务器http://192.168.0.6/abu.php 页面
如下图:
点击可以看到大图
这是我在服务器上的截图,注意,我们可以发现,服务器的CPU已经窜至80%左右。
我本机完整的记录见下面:
C:\>ab -n 1000 -c 20 http://192.168.0.6/abu.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.0.6 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software: Microsoft-IIS/6.0
Server Hostname: 192.168.0.6
Server Port: 80
Document Path: /abu.php
Document Length: 46499 bytes
Concurrency Level: 20
Time taken for tests: 52.46875 seconds
Complete requests: 1000
Failed requests: 10
(Connect: 0, Length: 10, Exceptions: 0)
Write errors: 0
Total transferred: 46673950 bytes
HTML transferred: 46498950 bytes
Requests per second: 19.21 [#/sec] (mean)
Time per request: 1040.938 [ms] (mean)
Time per request: 52.047 [ms] (mean, across all concurrent requests)
Transfer rate: 875.75 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 7 94.7 0 2984
Processing: 531 1020 528.3 813 3953
Waiting: 15 346 281.6 312 3656
Total: 531 1028 536.5 828 3968
Percentage of the requests served within a certain time (ms)
50% 828
66% 859
75% 921
80% 1031
90% 1812
95% 1890
98% 3812
99% 3937
100% 3968 (longest request)
好的,下面开始第二个阶段,换FastCGI
二、IIS6.0以FastCGI方式加载php环境并测试
IIS下可用的FastCGI扩展有很多种,我在这里给大家演示的是微软官方发布的扩展。
【下载】FastCGI Extension for IIS 6.0/5.1 微软官方发布的扩展,让IIS支持FastCGI
安装之后,默认是安装到%WINDIR%\system32\inetsrv路径下,当然直接拆出来用也可以。
没有图形界面,可以直接写配置文件或者通过官方配的fcgiconfig.js文件进行配置。
具体配置文件大家自己去挖掘研究了,我水平有限怕误导大家,故不提供了。
小插曲:在配置的过程中,还遇到了权限方面的小问题,还好我及时用 Filemon 找到问题所在。
看到了吧,php-cgi.exe权限缺了一点。
具体配置方面不是本文重点,不详细描述了。
好了,FastCGI模式配置好了。
注意Server API CGI/FastCGI表明成功加载PHP环境。
还是用上面的方法进行简单的压力测试
ab -n 1000 -c 20 http://192.168.0.6/abu.php
模拟出总共1000个网站请求,并发20个请求,访问服务器http://192.168.0.6/abu.php 页面
如下图:
点击可以看到大图
注意看CPU消耗小了很多,为了确保数据相对准确,隔了一会儿又再次做了两次测试
这是我在服务器上的截图,我们可以发现,基本上CPU的消耗在30-40%左右。
我本机完整的记录见下面:
C:\>ab -n 1000 -c 20 http://192.168.0.6/abu.phpThis is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Copyright 2006 The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.0.6 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requestsServer Software: Microsoft-IIS/6.0
Server Hostname: 192.168.0.6
Server Port: 80Document Path: /abu.php
Document Length: 52903 bytesConcurrency Level: 20
Time taken for tests: 55.234375 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 53101000 bytes
HTML transferred: 52903000 bytes
Requests per second: 18.10 [#/sec] (mean)
Time per request: 1104.688 [ms] (mean)
Time per request: 55.234 [ms] (mean, across all concurrent requests)
Transfer rate: 938.84 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 6 17.3 0 453
Processing: 500 1088 143.9 1062 1796
Waiting: 46 246 98.0 218 734
Total: 500 1095 145.1 1062 1796Percentage of the requests served within a certain time (ms)
50% 1062
66% 1078
75% 1093
80% 1109
90% 1156
95% 1421
98% 1687
99% 1718
100% 1796 (longest request)三、ISAPI和FastCGI两种模式对比测试的结果
根据上面的简单测试,我们可以发现,相同硬件环境下,FastCGI方式加载PHP环境比ISAPI方式加载PHP性能提高约1倍。
把服务器换成FastCGI方式加载PHP了,性能有了明显的提高。又可以继续压榨可怜的服务器,心里十分开心。
好的就到这里。下次有空阿布再给大家介绍如何具体配置IIS6.0环境下的FastCGI扩展。