php的运行原理、cgi对比fastcgi以及php-cgi和php-fpm之间的联系区别

2人阅读 评论(0) 收藏 举报
分类:

最近项目中本地测试环境遇到了windows环境下的nginx使用file_get_contents/curl访问php文件导致的阻塞问题,一直在找解决的方案,这个问题研究了三天终于找到了解决方案,特别因为这个我也对php的运行原理产生了兴趣,所以这里对此进行一定程度的记录,可能会有错漏的地方,欢迎指正。


要了解php的运行原理,首先要了解下面几个概念:


CGI:


CGI的英文是(COMMON GATEWAY INTERFACE)公共网关接口,它的作用就是帮助服务器与语言通信,这里就是nginx和php进行通信,因为nginx和php的语言不通,因此需要一个沟通转换的过程,而CGI就是这个沟通的协议。


nginx服务器在接受到浏览器传递过来的数据后,如果请求的是静态的页面或者图片等无需动态处理的则会直接根据请求的url找到其位置然后返回给浏览器,这里无需php参与,但是如果是一个动态的页面请求,这个时候nginx就必须与php通信,这个时候就会需要用到cgi协议,将请求数据转换成php能理解的信息,然后php根据这些信息返回的信息也要通过cgi协议转换成nginx可以理解的信息,最后nginx接到这些信息再返回给浏览器。


fast-cgi:


传统的cgi协议在每次连接请求时,会开启一个进程进行处理,处理完毕会关闭该进程,因此下次连接,又要再次开启一个进程进行处理,因此有多少个连接就有多少个cgi进程,这也就是为什么传统的cgi会显得缓慢的原因,因此过多的进程会消耗资源和内存。


而fast-cgi则是一个进程可以处理多个请求,和上面的cgi协议完全不一样,cgi是一个进程只能处理一个请求,这样就会导致大量的cgi程序,因此会给服务器带来负担。


php-cgi:


php-cgi是php提供给web serve也就是http前端服务器的cgi协议接口程序,当每次接到http前端服务器的请求都会开启一个php-cgi进程进行处理,而且开启的php-cgi的过程中会先要重载配置,数据结构以及初始化运行环境,如果更新了php配置,那么就需要重启php-cgi才能生效,例如phpstudy就是这种情况。


php-fpm:


php-fpm是php提供给web serve也就是http前端服务器的fastcgi协议接口程序,它不会像php-cgi一样每次连接都会重新开启一个进程,处理完请求又关闭这个进程,而是允许一个进程对多个连接进行处理,而不会立即关闭这个进程,而是会接着处理下一个连接。它可以说是php-cgi的一个管理程序,是对php-cgi的改进。


php-fpm会开启多个php-cgi程序,并且php-fpm常驻内存,每次web serve服务器发送连接过来的时候,php-fpm将连接信息分配给下面其中的一个子程序php-cgi进行处理,处理完毕这个php-cgi并不会关闭,而是继续等待下一个连接,这也是fast-cgi加速的原理,但是由于php-fpm是多进程的,而一个php-cgi基本消耗7-25M内存,因此如果连接过多就会导致内存消耗过大,引发一些问题,例如nginx里的502错误。


同时php-fpm还附带一些其他的功能:


例如平滑过渡配置更改,普通的php-cgi在每次更改配置后,需要重新启动才能初始化新的配置,而php-fpm是不需要,php-fpm分将新的连接发送给新的子程序php-cgi,这个时候加载的是新的配置,而原先正在运行的php-cgi还是使用的原先的配置,等到这个连接后下一次连接的时候会使用新的配置初始化,这就是平滑过渡。


可能上面文字叙述很难理解,下面用图形来简要的说明浏览器请求web服务器的过程、cgi以及fastcgi,以及php-cgi和php-fpm之间的区别和联系:





上面是使用php-fpm的动态页面的过程,下面补充没有普通cgi协议的情况;



这里的web server可以是nginx,也可以是IIS和apache等http服务器,也可以成为网站服务器或者前端服务器。

原文地址:https://blog.csdn.net/belen_xue/article/details/65950658





查看评论

分布式爬虫以及Scrapy源码剖析

信息时代,数据为王,互联网包含了迄今为止最有用的数据集,并且大部分可以免费公开访问,但是由于数据被嵌入在众多网站的结构和样式中导致难以被复用,应运而生出现了网络爬虫,使用程序自动获取互联网上的资源。本系列课程将带你开发自动化程序实现数据自动采集,针对众多网站防止数据被获取采取防爬虫方案,课程中包含对防爬策略所有解决方法,以及如何提高爬虫性能,爬虫方向真正做到“遇鬼杀鬼,遇神杀神,所向披靡”。
  • 2017年09月22日 10:25

Nginx解析PHP的原理 | CGI、FastCGI及php-fpm的关系

Nginx解析PHP的原理,CGI/FastCGI以及PHP-Fpm的关系. 一、PHP+Nginx应运而生的场景. 随着互联网的发展,用户对此接受面广,数据流的增大使得Web端的运行承载压力日益...
  • qq_36031499
  • qq_36031499
  • 2016-12-28 18:50:24
  • 1833

php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系

php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系
  • leyangjun
  • leyangjun
  • 2016-08-14 11:30:19
  • 668

php的工作模式CGI,FastCGI,PHP-CGI与PHP-FPM(转)

默认为将 PHP 编译为 CLI 和 CGI 程序。这将建立一个命令行解释器,可用于 CGI 处理或非 web 相关的 PHP 脚本。如果用户运行着一个 PHP 模块支持的 web 服务器,那通常为性...
  • lengyue1084
  • lengyue1084
  • 2016-10-12 17:05:40
  • 1066

CGI、FastCGI和php-fpm的概念和区别

在2000年或更早的时候,CGI比较盛行。那时,Perl是编写CGI的主流语言,以至于一般的CGI程序就是Perl程序。由于CGI程序的性能极其低下且安全性较差,现在基本没人使用。越来越多的人开始使用...
  • lamp_yang_3533
  • lamp_yang_3533
  • 2016-11-01 23:57:56
  • 2163

如何通俗地解释 CGI、FastCGI、php-fpm 之间的关系?

如何通俗地解释 CGI、FastCGI、php-fpm 之间的关系? 在apache里,可以以php5_module模块的方式调用PHP,而在nginx里面,则需要通过php-fpm来调用,...
  • linuxheik
  • linuxheik
  • 2016-07-26 20:18:05
  • 3471

php 、cgi 、fastcgi 、php-fpm之间的运行原理和机制分享二

FASTCGI:WEB服务器与处理程序之间通信的一种协议,是CGI的改进方案。  FASTCGI是常驻型的CGI,它可以一直运行,在请求到达时,不会花费时间去fork一个进程来处理。 Fastcg...
  • ahjxhy2010
  • ahjxhy2010
  • 2016-01-12 16:36:50
  • 1199

FastCGI和php-fpm的区别

一直以来对cgi、php-cgi和php-fpm的概念都比较模糊,今天整理了一下: 1、CGI是什么?     CGI是个协议,跟进程什么的没关系。     web server(比...
  • Jogger_Ling
  • Jogger_Ling
  • 2017-03-06 22:38:23
  • 500

php cgi和fastcgi简单区别

由于自己搭建环境.php文件总是不解析,出现502 badgateway错误。 检测应该是fastcgi与nginx没有打配好。 简单了解了下 主要区别: cgi是最早...
  • u010703523
  • u010703523
  • 2015-02-27 10:10:51
  • 1386

CGI,FAST-CGI,PHP-FPM的区别

CGI全称Common Gateway Interface即公共网关接口,它遵循cgi规范,定义了与其他服务之间的通信协议,如nginx将请求转给php时,应该携带哪些信息,header、postda...
  • xsgnzb
  • xsgnzb
  • 2016-10-20 17:49:39
  • 718
    个人资料
    持之以恒
    等级:
    访问量: 7155
    积分: 348
    排名: 23万+