今天我们来聊聊PHP在Web服务器中的实现方式,主要包括PHP CGI、PHP ISAPI和PHP FastCGI等几种方式。其中,PHP CGI是最常用的一种方式,因为其可移植性强,可以在各种Web服务器上面运行。
可以简单理解PHP CGI是一种通用的CGI处理器,它可以调用解释器去解释PHP脚本,并返回结果。在一个典型的PHP CGI服务器中,Web服务器接收到一个HTTP请求后,会将请求交给PHP解释器处理,解释器处理完后返回一个HTTP响应,再由Web服务器将它送到客户端。PHP CGI通常会使用以下命令来运行:
/c/path/to/php-cgi /path/to/script.php
其中,/c/path/to/php-cgi代表PHP解释器程序,而/path/to/script.php代表即将执行的PHP脚本。下面,我们将详细介绍PHP CGI的工作原理:
首先,Web服务器会通过环境变量向PHP CGI提供请求的信息,例如HTTP请求头、请求方法等。PHP CGI会解释这些信息,然后读取标准输入,通常是一个POST请求的数据。同时,PHP解释器也可以通过环境变量发送响应头信息,例如Content-Type,Content-Length等。解释器解释完PHP脚本后,会将结果输出到标准输出。一旦PHP CGI处理完客户端请求,它会发送正常HTTP响应,然后退出。下面是PHP CGI的一些特点:
- PHP CGI运行速度较慢,因为它需要进行重复的解释。
- PHP CGI需要为每一个HTTP请求都启动一个新的进程,这会比较消耗系统资源。
- PHP CGI比较安全,因为它不通常不会直接将内容添加到网页上。
除了PHP CGI之外,还有一种更加高效的方式,叫做PHP ISAPI。与PHP CGI不同,PHP ISAPI是一种基于Windows的方式,只能在Windows操作系统上面运行,并且只与Microsoft Internet Server (IIS)配合使用。下面我们来看一下PHP ISAPI的工作原理:
先来说一下ISAPI的概念。ISAPI(Internet Server Application Programming Interface)是一种接口程序,可以让Web服务器和扩展程序交流。通常在Windows IIS服务器上使用。而PHP-ISAPI则是一个外部附接的ISAPI扩展程序,可以处理PHP脚本并返回结果。
在PHP-ISAPI的工作中,对于每一个请求,IIS都只需开启一个工作线程来处理。因此,PHP-ISAPI的性能比PHP-CGI要好很多。但这带来一个弊端:由于线程共享内存,PHP脚本可能会相互影响,以及破坏进程的稳定性。同样,对于每一个ISAPI扩展程序,IIS都会将其加载到其自己的进程空间内,从而使每个扩展都可以调用IIS的API。PHP-ISAPI也不是没有劣势:
- 只能使用IIS Web服务器。
- 每个Web站点只能有一个PHP版本。
最后,还有一种方式叫做PHP FastCGI。FastCGI的概念与CGI类似,不同的是它改进了CGI不足的性能问题,可以实现进程复用,复用后台进程等待处理新的请求,消除了启动和关闭进程所带来的性能负担,更加适合PHP穿越Web服务器运行的模式。相比PHP CGI,PHP FastCGI有以下优势:
- 比PHP-CGI性能更好。
- 启动速度快。
- 支持后台进程。
尽管PHP FastCGI比PHP-CGI更快、更可靠,但也有一些缺点。例如,它需要更多的内存才能处理更多的并发请求;它不支持运行时动态加载扩展。
总的来说,PHP CGI、PHP ISAPI和PHP FastCGI都有各自的优缺点。如果是一个小型的Web应用程序,使用PHP CGI是完全可以的,如果要处理大量的并发请求,那么PHP FastCGI是一个不错的选择。当然,PHP ISAPI仅适用于使用Microsoft IIS的Windows服务器。选择哪种方式需要根据具体的业务需求和应用场景来确定。