mod_php模式
可以看出要求是发送到Apache,之后由Apache来解析处理PHP并返回结果给客户端。当我们利用LAMP架构时,须要改动Apache的配置文件httpd.conf
加入如下两句LoadModule phpx_module PHP_ROOT/phpxapache2_2.dllAddType appliaction/x-httpd-php.php将下面语句做如下修正<IfModule dir_module> DirectoryIndex index.html</IfModule>改为 <IfModule dir_module> DirectoryIndex index.html index.htm index.php index.phtml</IfModule>
利用LoadModule来加载phpx_module(x为PHP版本号)。可以理解为将PHP作为Apache的一个子模块来运行,当要求访问PHP时,Apache就会调用phpx_module来解析PHP代码。
php_module是如何解析PHP代码的呢?——通过sapi。
Apache和PHP与sapi的关系如下图:
sapi便是一个中间层,供应和外部通信的接口,类似于socket,使得PHP可以和其他运用进行数据交互。PHP供应了多种sapi,如给Apache和Nginx的php_module,给IIS的ISAPI等。
Apache调用PHP的实行过程:
Apache -> httpd -> php_module -> sapi -> PHP
总之,Web做事器通过php_module办法解析实行PHP的模式即为mod_php。
mod_fastcgi模式
PHP的sapi的另一种办法便是供应cgi模式,现在cgi已经被fastcgi取代。
所谓cgi,便是common gateway interface,当Web做事器收到要求,就会把要求交给cgi程序(如PHP的fastcgi),cgi就将要求做处理(解析PHP),然后将结果返回给Web做事器,Web做事器再将要求返回给客户端。
cgi的不敷之处便是每次要求都会有启动和退出的过程,也便是饱受诟病的fork-and-execute模式,在大量并发的请况下就塌台了。
fastcgi的出身填补这一不敷,它的事理是早早启动好等待要求,在相应完要求后不会退出,连续等待下一个要求。
利用fastcgi的运行办法称为mod_fastcgi。
比拟一下mod_php和mod_fastcgi的不同。前者是将PHP作为Web做事器的一个模块来运行,PHP与做事器结合度大。后者是将fastcgi作为中间过程,PHP和Web做事器只通过fastcgi来完成要求与相应。
mod_php模式下,Apache每接管一个要求,就会产生一个进程来连接PHP通过sapi完成要求,在高并发的情形下,显然做事器会无法承受。
这张图可以看出,每当有要求到达时,httpd会调用sapi将要求通报给PHP,完成后不退出,等待下一要求。并发性能大大提高。
php-fpm
磨刀不误砍柴工,前面的讲解只为引出php-fpm。php-fpm是做什么的呢?实在便是用来赞助fastcgi的。
fastcgi是一种与平台无关,与措辞无关的接口实现,只须要不同措辞按照规定办法实现即可完成与Web做事器的通信。上图所示的php-cgi便是PHP自带的fastcgi管理器。
网上看到的php-cgi的问题紧张有两点:
1.php-cgi变更php.ini陪之后须要重启php-cgi才能使新的php.ini生效,不能平滑重启。2.若直接杀去世php-cgi,PHP便无法运行
php-fpm完美办理了上述不敷,是一款专用的fastcgi管理器。
总之,php-fpm的浸染便是专门管理PHP中的fastcgi,使PHP在高并发的情形下也能安全稳定的与Web做事器互助,完成要求相应过程。