一、概述
首先,如标题所示我接下来的实验就是搭建一个LAMP平台然后实现一个Blog站点的实现,那"Php基于Apache的模块实现"这又是神马意思呢,我们知道Apache与Php的结合方式有常见的三种:基于module、基于CGI、基于Fast-CGI;
基于Module,指的就是Php在Apache编译时就直接编译成模块,以模块化的方式进行工作的,而当Apache需要解析Apache脚本时,它将直接调用这个模块的功能就可以了,它作为Apache的一个子进程来工作,而无需启动一个单独的进程,这里的前提就是Apache必须先装载Php模块;
基于CGI,Common Gateway Interface通用网关接口,它是一
种特殊的协议;例
如客户端请求了资源,httpd本身是无法解析脚本的,它也不可能将脚本执行以后返还给客户端,因此如果我们想在服务器端当用户请求一些特定资源时,将这种资源不是直接返还给客户端,而是让这个资源在服务器上先执行,把结果交给httpd,最后再回复给客户端,于是再详细点说就是:httpd本身不具备任何资源的解析功能,那就只能让httpd基于CGI协议将去调用客户请求的资源相对应的需要执行程序所拥有的执行环境来解析(例如这里提到的Php脚本资源),环境再将执行的结果返还给httpd,最后再将结果响应给客户端;所以CGI是能让我们的httpd服务能跟某一个应用程序执行环境进行通信并且能从这个环境获取执行结果的协议;所有能够基于CGI协议工作的协议都能够用作开发动态网站;但是CGI协议过于粗糙和简陋并且基于这种模式通信时它要求后端应用程序为了到达某种目的、获取某种资源必须要以管理员的身份去运行,这样一来就又有安全隐患了;于是基于CGI这样的模式逐渐淘汰了....所以现在有很多动态网站与前端通信时都不再基于CGI,比如Php的SAPI机制、Python的UWSGI的机制等等...它们使得这些脚本在执行时无需使用系统资源权限,而是在自己的程序环境中运行,对某些目录有操作权限就足够了;
基于Fast-CGI,上面我已经提到了基于模块时Php的工作模式,如果httpd启动的进程都运行Php代码,所以它会启动多个Php进程,对于httpd来说这些进程以后还需要关闭、收回、管理等等这样就变得非常的麻烦了,于是我为什么不让Php自己运行为一个服务,类似于httpd的prefork工作模式一样:启动时生成多少个子进程、最大空闲进程、最小空闲进程等等,当httpd需要运行Php代码时基于套接字连接Php这个服务所监听的端口上,将Php代码发送给Php由它其中的一个进程响应并解释运行后将结果返回给httpd,基于这样的机制,Php和httpd通信就需要一种协议了,这种协议就是Fast-CGI,于是这样一来Php作为一个单独的服务可以运行了,那我们就可以将它独立出来运行在不同的主机上了;