PHP运行方式

2017-10-28  本文已影响0人  NoFacePeace

早期

最早的Web服务器简单地响应浏览器发出的HTTP静态文件请求,并将存储在服务器上的静态文件(例如:jpg、htm、html)返回给浏览器。如图是处理流程:

处理流程

CGI

运行示意图

web服务器内置模块

后来,出现了一种比较高效的方式:Web服务器内置模块。例如,apache的mod_php模块。将php解释器做成模块,然后加载到apache服务器中。
这样,apache服务器在启动的时候,就会同时启动php模块。当客户端请求php文件时,apache服务器就不用再fork出一个新进程来启动php解释器,而是直接将php文件交给运行中的php模块来处理。显然,这种方式下,效率会比较高。
由于在apache服务器启动时,才会读取php的配置文件,加载php模块,在apache的运行过程中,不会再重新读取php的配置文件。所以,每次我们修改了php的配置文件后,必须重启apache,新的php配置文件才会生效。运行示意图如下:

运行示意图

FastCGI

FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着。FastCGI程序也可以和Web服务器分别部署在不同的主机上,它还可以接受来自其他Web服务器的请求。
FastCGI也是语言无关的。其主要行为是将CGI解释器进程保持在内存中并因此获得高效的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因。
FastCGI是一种进程管理工具,它可以在内存中管理CGI进程。
FastCGI进程管理器需要单独启动。启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。
当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI进程并不会随之关闭,而是继续等待主进程安排工作任务。由此可知,FastCGI的工作效率是非常高的。运行示意图如下:

运行示意图

php-fpm

fpm是FastCGI Process Manager的缩写,那么,fpm就是FastCGI进程管理器的简称,php-fpm就是php中的FastCGI进程管理器。对于php5.3之前的版本来说,php-fpm是一个第三方的补丁包,旨在将FastCGI进程管理整合进PHP包中。在php5.3之后的版本中,php-fpm不再是第三方的包,它已经被集成到php的源码中了。php-fpm提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以php-fpm被PHP官方收购了。

上一篇下一篇

猜你喜欢

热点阅读