cgi php-cgi,PHP底层原理

一  概念:

cgi

cgi(common gateway interface),通用网关接口。web server(如nginx)和脚本解析器(如php-cgi)之间交互的时候所使用的协议。它规定了诸如请求的url、http header、post数据等数据应该以怎样的格式传递给脚本解析器,以及脚本解析器应该以怎样的格式返回http response。
fastcgi
fastcgi是cgi的升级版协议。标准的cgi对每个请求会parse一遍对应脚本的配置文件(如php.ini),加载配置和扩展,初始化执行环境,性能非常差。fastcgi采用master-worker模式和常驻内存的的策略,提高了响应速度。
php-cgi
php的fastcgi实现,同时也作为php的脚本解析器负责运行php脚本;缺点是进程管理调度比较差。
php-fpm

用于管理和调度php-cgi进程,类似的有spawn-fcgi

二 原理

先了解一下普通cgi的工作流程:
web server收到用户请求,并把请求提交给cgi程序,cgi程序根据请求提交的参数作相应处理,然后输出标准的html语句返回给web server,web server再返回给客户端,这就是普通cgi的工作原理。

从上面看,cgi所要实现的不过是动态网页而已,这种处理方式的特点就是每接到一个请求,web server都要fork出一个单独的cgi程序的进程来处理,这种方式的好处是把web server和具体的程序处理独立开来,结构清晰,可控性强,同时缺点就是如果在高访问需求的情况下,cgi的进程fork就会成为很大的服务器负担,想象一下数百个并发请求导致服务器fork出数百个进程就明白了。这也是为什么cgi一直背负性能低下,高资源消耗的恶名的原因。

相应的有问题就有解决方案,目前流行的方案就是使用模块设计,基本上目前的web server都有相应的模块机制来扩充它的功能,只要按照其设计规范设计出来的模块,就能插入到web server自身的进程处理,因此性能有很大改观,例如IIS的isapi,apache的dso。但是,这种方法也不是没有缺点的,例如对于不同的web server,要按照不同标准开发,无法做到webserver无关性;例如这将输入验证的工作转交给了web server,没办法自由处理;例如一旦出现问题将影响整个web server处理流程;例如插入web server进程导致的无法以多用户标示运行,无法处理虚拟主机权限等。

所幸我们还有另外的选择,这就是fastcgi。fastcgi是基于cgi架构的扩展,他的核心思想就是在web server和具体cgi程序之间建立一个智能的可持续的中间层,统管cgi程序的运行,这样web server只需要将请求提交给这个层,这个层再派生出几个可复用的cgi程序实例,然后再把请求分发给这些实例,这些实例是可控的,可持续,可复用的,因此一方面避免了进程反复fork,另一方面又可以通过中间层的控制和探测机制来监视这些实例的运行情况,根据不同的状况fork或者回收实例,达到灵活性和稳定性兼得的目的。


三 PHP底层工作原理

http://blog.csdn.net/21aspnet/article/details/6973405

http://www.nowamagic.net/librarys/veda/detail/102/

你可能感兴趣的:(PHP)