当前位置: 首页 > 后端技术 > PHP

fastcgi和cgi有什么区别

时间:2023-03-29 20:41:54 PHP

前言CGI现在基本不用了,不安全,性能极低,越来越多的web内置扩展和fastCGI被使用。比如微软iis的ISAPI,apache的php模块,nginx的php-cgi。CGI、内置模块和fastcgi性能最佳。Fast_cgi是最快的,但需要额外的进程。下面我们来看看CGI和FASTCGI的区别。CGI方法介绍:cgi在2000年或者更早的时候用的比较多。过去,Web服务器一般只处理静态请求。遇到动态请求怎么办?web服务器根据这个请求的内容,fork一个新的进程来运行外部的c程序(或者perl脚本...),这个进程将处理后的数据返回给web服务器,最后web服务器发送内容给User,刚才fork的进程也退出了。如果下次用户还请求更改动态脚本,web服务器会再次fork一个新的进程,周而复始。web内置模块简介:后来出现了一种更高级的方法,即web服务器可以内置perl解释器或php解释器。也就是说,这些解释器做成模块的方式,web服务器启动的时候就会启动这些解释器。当有新的动态请求进来时,web服务器自己解析这些perl或php脚本,省去了重新fork一个进程,提高了效率。fastcgi方法介绍:fastcgi方法是web服务器收到请求时,不会重新fork一个进程(因为这个进程在web服务器启动的时候就启动了,不会退出),web服务器直接通过本进程的内容(进程间通信,但是fastcgi使用了另一种方式,tcp通信),收到请求后进行处理,将结果返回给web服务器,最后等待下一个请求,而不是退出。fastcgi与cgi的区别表:例如:服务器端现在有10万个单词,客户端每次都会发送一个字符串,询问这个字符串有多少个单词作为前缀。然后你就可以写一个程序,会建一个trie树,然后每次用户请求的时候直接去这个trie里找。但是如果用cgi的方式,请求结束后classtrie就没有了,下次启动进程的时候又要新建一颗trie树,效率太低了。在fastcgi方法中,在进程启动时就建立了该类的trie树,以后可以直接在trie树上查询指定的前缀。引用一个评论(https://segmentfault.com/q/10...)首先,CGI是做什么用的?CGI是为了保证web服务器传过来的数据是标准格式的,方便CGI程序的编写者。Web服务器(比如nginx)只是内容的分发者。例如,如果请求/index.html,Web服务器将在文件系统中找到此文件并将其发送到浏览器,浏览器将分发静态数据。好吧,如果当前请求是/index.php,根据配置文件,nginx知道这不是一个静态文件,需要到PHP解析器去处理,那么它就简单处理请求,然后交给到PHP解析器。Nginx会将哪些数据传递给PHP解析器?必须有url、查询字符串、POST数据和HTTP标头。那么,CGI就是一个协议,规定了传输什么数据,以什么格式传递给后方处理请求。仔细想想,你在你的PHP代码中使用的用户从哪里来。当webserver收到/index.php的请求后,会启动相应的CGI程序,也就是PHP解析器。接下来,PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,将处理后的结果以CGI指定的格式返回,并退出进程。然后网络服务器将结果返回给浏览器。嗯,CGI是一个协议,和进程无关。那么什么是fastcgi呢?Fastcgi用于提高CGI程序的性能。提高性能,那么CGI程序的性能问题在哪里呢?“PHP解析器将解析php.ini文件并初始化执行环境”,就是这样。标准的CGI会为每个请求执行这些步骤(不累!启动过程很累!),所以每次处理的时间会比较长。这显然是不合理的!那么Fastcgi是怎么做到的呢?首先,Fastcgi会先启动一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求进来时,master将其传递给worker,然后worker可以立即接受下一个请求。这样一来,避免了重复劳动,效率自然就高了。而当worker不够时,master可以根据配置预先启动几个worker等待;当然,当空闲的worker过多时,会停止一些,这样既提高了性能又节省了资源。这就是fastcgi的进程管理。那么PHP-FPM是什么?它是一个实现Fastcgi的程序,被PHP官方接受。众所周知,PHP的解释器是php-cgi。php-cgi只是一个CGI程序。它只能解析请求并返回结果。它不管理进程(陛下,妃子真的不行!)所以有一些程序可以调度php-cgi进程。例如,spawn-fcgi与lighthttpd分开。嗯,PHP-FPM也是这么个东西。经过长时间的发展,逐渐被大家所认可(要知道,前几年大家都在抱怨PHP-FPM稳定性差),并且越来越流行。好了,终于回到你的问题了。网上有人说fastcgi是一个协议,php-fpm就是实现了这个协议对。有的说php-fpm是fastcgi进程的manager,用来管理fastcgi进程的pairs。php-fpm的管理对象是php-cgi。但是不能说php-fpm是fastcgi进程的manager,因为前面说fastcgi是一个协议,好像没有这个进程,即使php-fpm存在也无法管理(至少目前)。有人说php-fpm是php内核的patch,之前是对的。因为php-fpm一开始并没有包含在php内核中,所以要使用这个功能,需要找到和源码版本相同的php-fpm给内核打补丁,然后编译。后来PHP内核集成PHP-FPM后,就方便多了,直接用编译参数--enalbe-fpm就可以了。有人说修改了php.ini配置文件后,没办法顺利重启,于是php-fpm诞生了。是的,修改php.ini后,php-cgi进程无法顺利重启。php-fpm对此的处理机制是新的worker使用新的配置,现有的worker处理完手头的工作就可以休息了。通过这种机制,过渡变得平滑。还有人说PHP-CGI是PHP自带的FastCGImanager,何必再弄一个php-fpm搞错了。php-cgi只是一个解释PHP脚本的程序。

最新推荐
猜你喜欢