
- 通用网关接口,就是外部应用程序(cgi程序)与web服务器之间的接口标准。
- nginx是内容分发者,如果是请求index.php,根据配置文件内容得知不是静态文件,就会去找对应的cgi程序进行解析
- cgi就是规定要传那些数据,以什么格式传递给后方进行处理的协议
- cgi工作模式,一个请求发送过来,启动cgi解释器(创建进程)->逻辑处理 ->退出 (fork and exec 模式) 每次都需要重新创建进程,加载配置,浪费系统资源
2. fastcgi
- 快速通用网关接口,常驻型的cgi,不用每次都fork进程,其会使cgi解解释器进程常驻内存,所以性能较高
- master-worker模型,服务器启动时载入fastcgi进程管理器
- fastcgi会进行自身初始化,初始化时会创建多个进程
- 请求到达web服务器后,fastcgi进程管理器会选择并通过socket连接到一个cgi解释器
3. php-cgi
- php自带的cgi管理器
- php-cgi的缺点,不能平滑重启,需要重启php-cgi才能使php.ini生效
4. php-fpm
- php-fpm是php的一种fastcgi的实现,管理php的fastcgi进程池
- 能够调度php-cgi程序
- 能够实现平滑重启
- php-fpm创建一个master进程,然后创建进程池,监听socket,fork出多个子进程,子进程各自accept请求,php-fpm的子进程同时只能响应一个请求,处理完一个请求才可以accept下一个请求,多进程,同步阻塞模型
- master和worker进程之间不直接进行通信,master通过共享内存获取worker进程信息,master进程发送信号通知worker进程
- php-fpm可以同时监听多个端口,每个端口对应一个worker pool
- worker是cgi程序,php-fpm是fastcgi协议的php是实现
一般的网页服务架构是这样的:
浏览器|
网站服务器(apache, nginx等) 只支持静态内容(html, 图片,文件)
| \
CGI Fast CGI (两种编程规范,按照特定的方式读输入,写输出。也叫协议。)
| |
任何语言 任何语言 (按照上面的规范来写代码,提供动态内容,比如读写数据库,根据数据库展示不同内容)
任何语言中就包括了php
其中CGI的方式就是,网站服务器会把CGI程序当成普通的程序一样调用,然后把CGI程序的标准输出流作为内容返回给浏览器。每来一个请求,就要启动一个CGI程序。所以php可以直接加上可执行属性(仅linux),就可以让网站服务器调用。缺点是响应慢而且占用内存多(每次启动程序的消耗较大)。
而FastCGI的方式就是,网站服务器通过socket跟FastCGI程序获取输入输出。FastCGI程序会启动一个程序一直运行并监听端口。每来一个请求,不需要再启动新的程序。php提供了php-fpm这个东东来监听端口。
CGI程序的功能:首先Nginx等webserver向这个CGI程序请求某个页面,如果该页面存在,CGI程序就会去获取那个页面的原始数据,然后把它转换成HTML并把结果返回给webserver进而输出给用户浏览器。PHP等只要能够处理文本的语言都可以用于编写CGI程序。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)