Total Pageviews

Monday 16 July 2012

运行php程序的几种方式及其原理

摘要:
本文主要讨论了运行php程序的几种方式及其原理、优势、劣势。 并对于提升web服务器的效率的方法做了简要分析。

目前通过web服务器运行php程序来提供服务的主要方式有三种:

1,cgi方式
 原理:web服务器接收到请求后,执行对应的cgi程序,将cgi程序输入输出重定向到web服务器的输入输出。
优势:众多WEB服务器的普遍支持。
劣势:响应每次请求时,都需要fork新的进程,然后exec对应的cgi程序,开销较大。

2,mod_php方式
 原理:将php解释器嵌入到web服务器进程中。无需新的进程,无需额外的进程间通信。
优势:额外开销很小,性能优异,是三种方式中效率最高的方式。
劣势:貌似只有Apache支持此种方式。

3,fastcgi方式
原理:php解释器一直运行,一般通过socket方式与web服务器通信。
优势:响应请求时,无需fork新的进程。主流web服务器都支持。
劣势:web服务器与php解释器通过socket方式通讯,存在一定的开销。

单纯就运行PHP程序来说,我认为Apache服务器的mod_php方式是最合适的选择。

为何有人极力鼓吹nginx + fastcgi 方式?
据我了解,鼓吹此种方式的理由或者卖点主要是宣称能够“支撑数万的并发请求”。
姑且不谈“数万并发”的实际含义,单就运行php程序而言,web服务器本身并不会是性能瓶颈。

我们并非期望:服务能够同时接受1万个连接,然后慢慢处理完成这些请求。
我们所期望的是:服务能够在迅速完成1万次请求的响应,然后释放资源。
所以,对于运行php程序(任何需要响应大量请求的程序)来说,我们的主要工作是:缩短每次请求的响应时间。

缩短单次请求响应时间的途径:
 一,提升php程序执行效率。主要途径:
1,代码层次的优化,比如合并循环,提取循环中的重复计算。通用的模块使用C语言编写。
2,加速器的使用,比如APC加速器,可以避免代码的重复分析,减少代码的重复访问产生的IO。
3,合并php文件,减少因访问代码产生的开销。

 二,减少外部资源(MySQL数据库,Memcache缓存等)的访问。
1,减少MySQL数据库的访问,地球人都知道的秘籍:使用Memcache缓存。
2,减少Memcache缓存的访问,可以做本地(本服务器)或者本进程(进程内部缓存)等。

 三,优化外部资源(MySQL数据库,Memcache缓存等),缩短响应时间。
1,良好的数据库设计,提升数据库服务器效率。
2,提升服务器的配置,比如加大内存,使用SSD存储等。
3,简化数据库存储引擎,提高数据访问效率。比如使用MongoDB。

 至于其他奇技淫巧,简要列举一下:
1,完全使用C、C++语言编写服务程序。部分应用可以考虑采用此方式。
2,通过http协议提供的部分机制,减少请求次数,比如Conditional GET等。
3,对于不经常更新的接口使用varnish、squid等做缓存。
4,增加访问缓冲代理层。此举主要针对慢速网络链接有效.