c可以做网站么,购物网站如何做推广,网站建设时 网站信息可以边建设边组织,网站建设价格标准报价一、抛个砖1、Web Server传递数据的方法正式说CGI之前#xff0c;先来了解一下Web Server传递数据的另外一种方法#xff1a;PHP Module加载方式。相信都会想起Apache吧#xff0c;初学php时#xff0c;在windows上安装完php和Apache之后#xff0c;为了让Apache能够解析p… 一、抛个砖1、Web Server传递数据的方法正式说CGI之前先来了解一下Web Server传递数据的另外一种方法PHP Module加载方式。相信都会想起Apache吧初学php时在windows上安装完php和Apache之后为了让Apache能够解析php代码我们会在Apache的配置文件(httpd.conf)中添加如下配置#添加下边两行LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容 DirectoryIndex index.php index.html当在linux环境下源码安装时大致是这样# ./configure --with-mysql/usr/local --with-apache/usr/local/apache --enable-track-vars其实原理都是用LoadModule来加载php5_module就是把php作为apache的一个子模块来运行。当通过web访问php文件时apache就会调用php5_module来解析php代码。 那么php5_module是如何将数据传给php的解析器来解析php代码的呢 答案是sapi用一张图来看apache、php、sapi三者之间的关系 从上面图中我们看出了sapi就是这样的一个中间过程sapi提供了一个和外部通信的接口使得PHP可以和其他应用进行交互数据(apachenginx等)。php默认提供了很多种sapi常见的提供给apache和nginx的php5_module、CGI、FastCGI给IIS的ISAPI以及Shell的CLI。(httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程它会建立一个处理请求的子进程或线程池)所以以上的apache调用php执行的过程如下apache - httpd - php5_module - sapi - php这种模式将php模块安装到apache中每一次apache请求都会产生一条进程这个进程就完整的包括php的各种运算计算等操作。在上图中我们很清晰的可以看到apache每接收一个请求都会产生一个进程来连接php通过sapi来完成请求可想而知如果一旦用户过多并发数过多服务器就会承受不住了。而且把php当做一个模块加载到apache中出问题时很难定位是php的问题还是apache的问题。 2、引出概念在整个网站架构中Web Server(如Apache、Nginx)只是内容的分发者。举个栗子如果客户端请求的是 index.html那么Web Server会去文件系统中找到这个文件发送给浏览器这里分发的是静态数据。 如果请求的是 index.php根据配置文件Web Server知道这个不是静态文件需要去找 PHP 解析器来处理那么他会把这个请求简单处理然后交给PHP解析器。 当Web Server收到index.php 这个请求后会启动对应的 CGI 程序这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件初始化执行环境然后处理请求再以规定CGI规定的格式返回处理后的结果退出进程Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程接下来再引出这些概念会好理解很多。CGI是 Web Server 与 Web Application 之间数据交换的一种协议。FastCGI同 CGI是一种通信协议但比 CGI 在效率上做了一些优化。PHP-CGI是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。PHP-FPM是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序额外还提供了相对智能一些任务管理。(Web Server 一般指Apache、Nginx、IIS、Tomcat等服务器Web Application 一般指PHP、Java、Asp.net等应用程序) 二、概念1、CGICGI(Common Gateway Interface)全称是“通用网关接口”WEB 服务器与PHP应用进行“交谈”的一种工具其程序须运行在网络服务器上。CGI可以用任何一种语言编写只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。WEB服务器会传哪些数据给PHP解析器呢URL、查询字符串、POST数据、HTTP header都会有。所以CGI就是规定要传哪些数据以什么样的格式传递给后方处理这个请求的协议。也就是说CGI就是专门用来和 web 服务器打交道的。web服务器收到用户请求就会把请求提交给cgi程序(如php-cgi)cgi程序根据请求提交的参数作应处理(解析php)然后输出标准的html语句返回给web服服务器WEB服务器再返回给客户端这就是普通cgi的工作原理。(cgi程序你就可以理解成遵循cgi协议编写的程序)优点CGI的好处就是完全独立于任何服务器仅仅是做为中间分子。提供接口给web服务器和web应用(如提nginx和php)。他们通过cgi搭线来完成数据传递。这样做的好处了尽量减少2个的关联使他们2变得更独立。缺点但是CGI有个难受的地方就是每一次web请求都会有启动和退出过程也就是最为人诟病的fork-and-execute模式这样一在大规模并发下就死翘翘了。 2、FastCGI从根本上来说FastCGI是用来提高CGI程序性能的。类似于CGIFastCGI也可以说是一种协议。FastCGI像是一个常驻(long-live)型的CGI它可以一直执行着只要激活后不会每次都要花费时间去fork一次。FastCGI是和语言无关的、可伸缩架构的CGI开放扩展其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知CGI解释器的反复加载是CGI性能低下的主要原因如果CGI解释器保持在内存中并接受FastCGI进程管理器调度则可以提供良好的性能、伸缩性、Fail- Over特性等等。举例当web server收到/index.php请求看一下CGI程序和FastCGI程序分别是怎么处理的CGI当收到web server请求后会启动对应的CGI程序这里就是PHP的解析器(php-cgi)。接下来PHP解析器会解析php.ini文件初始化执行环境然后处理请求再以规定的CGI规定的格式返回处理后的结果退出进程。(CGI每次接收到请求都会执行这些步骤)FastCGI首先FastCGI程序会先启动一个master解析配置环境初始化执行环境然后再启动多个worker。当请求过来时master会传递给一个worker然后立即可以接受下一个请求。这样就避免了重复的劳动效率自然是高。而且当worker不够用时master可以根据配置预先启动几个worker等着当然空闲worker太多时也会停掉一些这样就提高了性能也节约了资源这就是fastcgi对进程的管理。(CGI程序和FastCGI程序可以理解成遵循CGI协议和FastCGI协议编写的程序)FastCGI的工作原理FastCGI接口方式采用C/S结构可以将HTTP服务器和脚本解析服务器分开同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时可以将其直接交付给FastCGI进程来执行然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端这在很大程度上提高了整个应用系统的性能。 (1)Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)(2)FastCGI进程管理器自身初始化启动多个CGI解释器进程(可建多个php-cgi)并等待来自Web Server的连接。(3)当客户端请求到达Web Server时FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。(4)FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。在CGI模式中php-cgi在此便退出了。CGI与FastCGI比较(1)对于CGI来说每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重新初始化全部数据结构。而使用FastCGI所有这些都只在进程启动时发生一次。一个额外的好处是持续数据库连接(Persistent database connection)可以工作。(2)由于FastCGI是多进程所以比CGI多线程消耗更多的服务器内存php-cgi解释器每进程消耗7至25兆内存将这个数字乘以50或100就是很大的内存数。 3、PHP-FPM首先要说的是fastcgi是一个协议php-fpm实现了这个协议。大家都知道PHP的解释器是php-cgi。php-cgi只是个CGI程序他自己本身只能解析请求返回结果不会进程管理所以就出现了一些能够调度php-cgi进程的程序php-fpm就是这样的一个东西。它克服了php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效不可以平滑重启直接杀死php-cgi进程php就不能运行了的问题。修改php.ini之后php-cgi进程的确没办法平滑重启的。php-fpm对此的处理机制是新的worker用新的配置已经存在的worker处理完手上的活就可以歇着了通过这种机制来平滑过度。php-fpm提供了更好的php进程管理方式可以有效的控制内存和进程可以平滑重载php配置。总结一下这个升级的过程 如果要搭建一个高性能的PHP WEB服务器目前最佳的方式是Apache/Nginx FastCGI PHP-FPM(PHP-CGI)方式了。 参考 https://segmentfault.com/a/1190000010968145 https://www.awaimai.com/371.html