CGI初接触

由于自己是一名PHP程序员,经常要搭建php的运行环境,现在比较流行的nginx+php的环境很受欢迎,而其所采用的模式是FastCGI的方式,所以花了一些时间了解了一下FastCGI。

CGI(Common Gateway Interface)

在开始进入FastCGI之前我想先聊一聊其前身CGI。首先CGI是一个协议,它独立于编程语言,但是可以用编程语言来实现CGI——也就是CGI应用程序。在早先web 服务器只提供静态的内容给客户端,但是随著需求的增加,渐渐的最初的web服务器并不能满足这些需求,于是就产生了很多的技术来处理动态的内容,CGI就是这些需求下的产物。

那CGI应用程序究竟是如何工作的呢:

1. 对于每一个请求,服务器都会创建一个新的进程来处理这个请求。

2. Web 服务器使用环境变量来将请求信息传递给CGI程序进行处理。接着是用户交互的一些信息(比如说用户通过form表单提交的信息),web服务器将会把http头信息等传递给CGI的标准输入(stdin)由CGI程序进行处理。然后是输出信息写入标准输出文件(stdout)和错误信息写入标准错误文件(stderr)由CGI程序返回给web服务器,由服务器返回给客户端。(从这一点可以看出web服务器和CGI应用程序必须在同一台机器上)

3. CGI进程结束标志着当前请求的完成。

所以说CGI的工作原理图如下面所示

我们可以看到,当进程4终止以后请求4的请求也就结束了。使用CGI此种技术有其本身的优点。

1. 简单,对于开发人员来说此种方式很容易理解

2. CGI是一种协议,独立于开发语言,几乎可以用任何语言来实现

3. 进程独立,CGI应用程序是在独立的进程中运行的,而不是在Web服务器主进程中运行。此种方式使得CGI应用如果崩溃的话并不会影响Web服务

4. 最后,CGI的设计并不会受服务器架构的影响,它不会去关心服务器是单线程的还是多线程等等。

当然,事物总有其两面性,既然CGI有这些优点,那伴随而来的肯定也有其缺陷。最大的缺陷就是性能问题,因为对于每一个请求都会创建一个进程,当请求结束以后进程就会被杀掉回收,这样就使得性能有所下降。还有就是其第三个优点也正是其缺点,因为CGI进程是独立的,不会影响Web服务器进程,所以说它并不能连接到Web服务器的其它请求处理的阶段。

Server APIS

针对CGI的主要的性能问题,一些Web服务器已经集成了APIs来解决CGI的由于进程的创建和消失导致的性能下降的问题。使用API要比CGI运行的快,这是因为应用程序是在服务进程中运行的,并且此程序一直在请求资源。除此之外APIs提供了比CGI更多的功能,比如可以连接到web服务器的其它请求处理的阶段,这一点正是CGI所不具备的。

然而Server APIs的这些好处正是牺牲了CGI的优点才得以实现的。也就是说,Server APIs的劣势对应于CGI的优势。

首先APIs的实现是非常复杂的,其实现代价要比CGI提升了很多;其次APIs依赖于编程语言,应用程序必须由提供商的API支持的语言才能开发(通常使用的是C/C++)。像perl这种解释型的语言就得靠边站了,虽然说它很受CGI的欢迎;然后是其进程不是独立的,它的运行需要依赖于服务器的主进程,所以说存在bug的程序可能会降低web服务器的安全性能,反过来说存在bug的web服务器也可能会使应用程序崩溃;最后就是它和web服务器的架构结合的特别紧密,如果说web服务器是多线程的,那么API应用程序必须考虑线程的安全。如果web服务器是单线程的,那多线程的应用程序也就没有其用武之地了。并且如果服务器提供商改变了其web服务器的架构,那应用程序必须做出相应的改写。

例如PHP程序员经常使用的Apache+php的开发环境,PHP的解释器就是作为Apache的模块来运行的,也就是PHP程序是在Apache的进程下面执行的。而Apache是多线程的,所以说PHP必须考虑线程之间的安全。但是对于另一种web服务器nginx来说,nginx是单线程的,所以PHP就可以不用考虑线程之间的安全问题。所以说PHP的同一版本(在PHP5.3版本以前)一般情况下是有NTS(非线程安全)和线程安全两种的。

总结以上两种方式,各有其优点和缺点,而当前大多数web服务器使用了FastCGI的方式来进行请求处理,此种方式结合了CGI和APIs各自显著的优点。

本文转载自:迹忆客(https://www.jiyik.com)

以上是 CGI初接触 的全部内容, 来源链接: utcz.com/z/290018.html

回到顶部