
文章插图
所以,我们首先需要一个wrapper,这个wrapper需要完成的工作:
通过调用fastcgi(库)的函数通过socket和ningx通信(读写socket是fastcgi内部实现的功能,对wrapper是非透明的)调度thread,进行fork和kill和application(php)进行通信
3、spawn-fcgi与PHP-FPMFastCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称为FastCGI引擎 。spawn-fcgi与PHP-FPM就是支持PHP的两个FastCGI进程管理器 。因此HTTPServer完全解放出来,可以更好地进行响应和并发处理 。
spawn-fcgi与PHP-FPM的异同:
1)spawn-fcgi是HTTP服务器lighttpd的一部分,目前已经独立成为一个项目,一般与lighttpd配合使用来支持PHP 。但是ligttpd的spwan-fcgi在高并发访问的时候,会出现内存泄漏甚至自动重启FastCGI的问题 。即:PHP脚本处理器当机,这个时候如果用户访问的话,可能就会出现白页(即PHP不能被解析或者出错) 。
2)Nginx是个轻量级的HTTP server,必须借助第三方的FastCGI处理器才可以对PHP进行解析,因此其实这样看来nginx是非常灵活的,它可以和任何第三方提供解析的处理器实现连接从而实现对PHP的解析(在nginx.conf中很容易设置) 。nginx也可以使用spwan-fcgi(需要一同安装lighttpd,但是需要为nginx避开端口,一些较早的blog有这方面安装的教程),但是由于spawn-fcgi具有上面所述的用户逐渐发现的缺陷,现在慢慢减少用nginx+spawn-fcgi组合了 。
由于spawn-fcgi的缺陷,现在出现了第三方(目前已经加入到PHP core中)的PHP的FastCGI处理器PHP-FPM,它和spawn-fcgi比较起来有如下优点:
由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,也就是说编译到php core中了,因此在性能方面要优秀一些;
同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器 。因此,推荐使用Nginx+PHP/PHP-FPM这个组合对PHP进行解析 。
相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼 。
FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 。
4、Nginx+PHP-FPMPHP-FPM是管理FastCGI的一个管理器,它作为PHP的插件存在,在安装PHP要想使用PHP-FPM时在老php的老版本(php5.3.3之前)就需要把PHP-FPM以补丁的形式安装到PHP中,而且PHP要与PHP-FPM版本一致,这是必须的)
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中 。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用 。
PHP5.3.3已经集成php-fpm了,不再是第三方的包了 。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了 。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM 。
fastcgi已经在php5.3.5的core中了,不必在configure时添加 --enable-fastcgi了 。老版本如php5.2的需要加此项 。
当我们安装Nginx和PHP-FPM完后,配置信息:
PHP-FPM的默认配置php-fpm.conf:
listen_address 127.0.0.1:9000 #这个表示php的fastcgi进程监听的ip地址以及端口Nginx配置运行php: 编辑nginx.conf加入如下语句:
start_servers
min_spare_servers
max_spare_servers
location ~ .php$ {Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,而这里的IP地址和端口就是FastCGI进程监听的IP地址和端口 。
root html;
fastcgi_pass 127.0.0.1:9000; 指定了fastcgi进程侦听的端口,nginx就是通过这里与php交互的
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
}
其整体工作流程:
1)、FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程 。
主进程php-fpm主要是管理fastcgi子进程,监听9000端口 。
fastcgi子进程等待来自Web Server的连接 。
2)、当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理 。
推荐阅读
- 5分钟学会从此不违章! 交通图解
- 离职要懂得维权!一文让你彻底搞懂经济补偿的N、N+1、2N、2N+1
- 2步搞定抖音怎么把抖音标志去掉,简简单单
- 苹果手机照片彻底删除后怎么恢复?照片误删这样恢复
- 三个步骤帮你轻松搞定微信公众号平台!
- 6分钟教你彻底理解三原色的色彩原理,轻松模仿各路大神作品色调
- 简单直接。一文搞懂医疗险
- 是玉帝的女儿还是妹妹?《西游记》可能搞错了 二郎神的母亲
- 彻底弄懂UTF-8、Unicode、宽字符、locale
- 一文搞懂什么是 C# 计时器!
