zoukankan      html  css  js  c++  java
  • apache php的几种运行方式(cgi,fastcgi

    今天在安装 APC 扩展,发现报一连串错误。

    找百娘帮助,有phper也遇到这种情况,分析是因为php的版本问题,php5.5的版本,安装会各种错误。

    本人虚拟机的liunx 里面的版本 就是5.5.7.  

    在系统里面以前和单独编译过7.0的版本,现在的CGI 的版本是7.0。后面没学会怎么把php加入Apache 。

    只能安装了一个集成环境,集成环境的版本是5.5.7 .

    后面一直有想升级的打算,今天遇到这个问题。所以在网上查找方法。怎么升级。

    最后看到php 有几种运行的方式,特此记录一下

    ++++++++++++++++++++++++++++++++++++++++++++

    PHP的所有应用程序都是通过WEB服务器(如IIS或Apache)和PHP引擎程序解释执行完成的,

    工作过程:
    (1)当用户在浏览器地址中输入要访问的PHP页面文件名,然后回车就会触发这个PHP请求,并将请求传送化支持PHP的WEB服务器。
    (2)WEB服务器接受这个请求,并根据其后缀进行判断如果是一个PHP请求,WEB服务器从硬盘或内存中取出用户要访问的PHP应用程序,并将其发送给 PHP引擎程序。
    (3)PHP引擎程序将会对WEB服务器传送过来的文件从头到尾进行扫描并根据命令从后台读取,处理数据,并动态地生成相应的HTML页面。
    (4)PHP引擎将生成HTML页面返回给WEB服务器。WEB服务器再将HTML页面返回给客户端浏览器。
     
    apache的运行阶段
      Apache将请求处理循环分为11个阶段,依次是:Post-Read-Request,URI Translation,Header Parsing,Access Control,Authentication,Authorization,MIME Type Checking,FixUp,Response,Logging,CleanUp。
     
    --------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------------------------------------------

    最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理,借这个机会赶集恶补一下这个知识。

    l:即操作系统,也就是建立在电脑硬件基础上的最底层的东西,相当于:国家这个概念,而win或者Linux就相当于不同的国家

    a:就是web服务器,这个服务器 相当于国家领导人:主席,起到指导作用。

    m:就是数据库,存储数据的地方,相当 银行

    p:就是php,相当于下属,做事情的人

    也就是说php是apache的一个外挂程序,必须依靠web服务器才可以运行。当客户端浏览器触发事件--->php程序提交到apache服务器---->apache服务器根据php程序的特点判断是php程序,提交给php引擎程序--->php引擎程序解析并读取数据库生成相应的页面

    php引擎;像smarty就是,有自己的标签模式并可以解析这种标签 生成原生态的php程序

    那么如何优化网站呢?其实就是触发时间到生成相应的页面过程,这个时间差越小,用户体验越好,那么根绝上面几步,我们可以想到的优化方法就是:客户端提交的数据大小已经并发数量----- 都提交给apache服务器处理---apache分配给php引擎---php程序和读取数据库---输出

    1:优化 客户端数据提交,不过当用户达到一定级别时候,这个数据还是很大的

    2:优化 web服务器,主要是处理高并发的性能

    3:优化php引擎程序:samrty模版的引擎很不错

    4:优化php程序:主要是数据库读取的方面和php自身程序效率

    5:数据库优化:数据库的配置以及优化方式,达到与php读取效率的最完美匹配

    6:输出优化:使用js等技术 ajax技术

    --------------------------------------------------------------------------------------------------------------------
    --------------------------------------------------------------------------------------------------------------------
    虚拟主机通常用fast-cgi或者php-cgi方式,因为可以把php程序和apache隔离开,防止虚拟主机的拥有者执行恶意程序。
    apache handler(模块方式)的方式效率最高,但是php和apache运行在一个进程里面,所以php做什么事情都会影响apache。
    如果你是自己的服务器,还是handler吧。
    ----------------------------------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------------------------

    一. 可以配置Apache将PHP解释器作为CGI脚本,或者作为Apache本身的一个模块(mod_php),还有就是FastCGI模式来运行。

    CGI是比较原始的方式,Apache默认是以第二种方式运行PHP的,而配置FastCGI模式需要下载安装相关的包。

    性能上,CGI模式每一次接到请求会调用php.exe,解析php.ini,加载DLL等,速度自然慢。

    后两种方式会在Web程序启动时就作为启动,等待请求;其中FastCGI下,实现了类似连接池的技术特性,保持了对后台的连接,请求到来即可使用,结束即断开准备与下一个请求连接。

    实际中,有人认为FastCGI比mod_php模式慢,有认为前者是后者性能的80%的,还有人测试后认为:对于匿名访问,前者约为后者性能的63%,认证访问时也低了18%。一般认为,FastCGI是适用于高并发使用场景下的,同时使用FastCGI可以使得程序在Web Server产品与代码两端都具有更好的选择自由度。

    二.Nginx默认不支持CGI模式,它是以FastCGI方式运行的。所以使用Nginx+PHP就是直接配置为FastCGI模式。

    For the most part, lack of CGI support in Nginx is not an issue and actually has an important side-benefit: because Nginx cannot directly execute external programs (CGI), a malicious person can't trick your system into uploading and executing an arbitrary script.

     http://wiki.nginx.org/SimpleCGI( 修改为CGI模式)

    ---------------------------------------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------------------------------
     

    php在apache中一共有三种工作方式:CGI模式、Apache 模块DLL、FastCGI模式)

    以下分别比较:

    1. CGI模式与模块模式比较:

    php在apache中两种工作方式的区别(CGI模式、Apache 模块DLL)
    这两种工作方式的安装:

    PHP 在 Apache 2.0 中的 CGI 方式
    ScriptAlias /php/ "c:/php/"
    AddType application/x-httpd-php .php

    # 对 PHP 4 用这行
    Action application/x-httpd-php "/php/php.exe"

    # 对 PHP 5 用这行
    Action application/x-httpd-php "/php/php-cgi.exe"
    PHP 在 Apache 2.0 中的模块方式
    # 对 PHP 4 用这两行:
    LoadModule php4_module "c:/php/php4apache2.dll"
    # 别忘了从 sapi 目录中把 php4apache2.dll 拷贝出来!
    AddType application/x-httpd-php .php
    # 对 PHP 5 用这两行:
    LoadModule php5_module "c:/php/php5apache2.dll"
    AddType application/x-httpd-php .php

    # 配置 php.ini 的路径
    PHPIniDir "C:/php"

    这两种工作方式的区别:
    CGI模式下,如果客户机请求一个php文件,Web服务器就调用php.exe去解释这个文件,然后再把解释的结果以网页的形式返回给客户机;
    而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。
    所以从某种角度上来说,以apache模块方式安装的 PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。

    2. FastCGI运行模式分析:

    FastCGI的工作原理是:

    (1)、Web Server 启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】(IIS ISAPI或Apache Module);
    (2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
    (3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。 
    (4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。

    在上述情况中,你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些 都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

     

    3. 为什么要使用FastCGI,而不是多线程CGI解释器?
    这可能出于多方面的考虑,例如:
    (1)、你无论如何也不能在windows平台上稳定的使用多线程CGI解释器,无论是IIS ISAPI方式还是APACHE Module方式,它们总是运行一段时间就崩溃了。奇怪么?但是确实存在这样的情况!
    当然,也有很多时候你能够稳定的使用多线程CGI解释器,但是,你有可能发现网页有时候会出现错误,无论如何也找不到原因,而换用FastCGI方式 时这种错误的概率会大大的降低。我也不清楚这是为什么,我想独立地址空间的CGI解释器可能终究比共享地址空间的形式来得稳定一点点。
    (2)、性能!性能?可能么,难道FastCGI比多线程CGI解释器更快?但有时候确实是这样,只有测试一下你的网站,才能最后下结论。原因嘛,我觉得 很难讲,但有资料说在Zend WinEnabler的时代,Zend原来也是建议在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module,不过现在Zend已经不做这个产品了。

     

    4. FastCGI 模式运行PHP 的优点:

     FastCGI 模式运行 PHP 有几个主要的好处。首先就是 PHP 出错的时候不会搞垮 Apache,只是 PHP 自己的进程当掉(但 FastCGI 会立即重新启动一个新 PHP 进程来代替当掉的进程)。其次 FastCGI 模式运行 PHP 比 ISAPI 模式性能更好(我本来用 ApacheBench 进行了测试,但忘了保存结果,大家有兴趣可以自己测试)。

    最后,就是可以同时运行 PHP5 和 PHP4。参考下面的配置文件,分别建立了两个虚拟主机,其中一个使用 PHP5,另一个使用 PHP4。

    LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP13.dll

    ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"

    FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3

    ScriptAlias /fcgi-php4/ "d:/usr/local/php-4.3.11/"

    FastCgiServer "d:/usr/local/php-4.3.11/php.exe"

    Listen 80

    NameVirtualHost *:80

    DocumentRoot d:/www

    Options Indexes FollowSymlinks MultiViews

    ServerName php5.localhost

    AddType application/x-httpd-fastphp5 .php

    Action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"

     

    IndexOptions FancyIndexing FoldersFirst

    Options Indexes FollowSymLinks MultiViews

    AllowOverride None

    Order allow,deny

    Allow from all

     

    Listen 8080

    NameVirtualHost *:8080

     

    DocumentRoot d:/www

    Options Indexes FollowSymlinks MultiViews

    ServerName php4.localhost

    AddType application/x-httpd-fastphp4 .php

    Action application/x-httpd-fastphp4 "/fcgi-php4/php.exe"

     

    Options Indexes FollowSymLinks MultiViews

    AllowOverride None

    Order allow,deny

    Allow from all

     

    使用上面的配置,访问 http://localhost/ 就使用 PHP5,而访问 http://localhost:8080/ 就使用 PHP4。所以只要合理配置,就可以让不同的虚拟主机使用不同版本的 PHP。

    FastCGI 模式的一些缺点:

    说完了好处,也来说说缺点。从我的实际使用来看,用 FastCGI 模式更适合生产环境的服务器。但对于开发用机器来说就不太合适。因为当使用 Zend Studio 调试程序时,由于 FastCGI会认为 PHP 进程超时,从而在页面返回 500 错误。这一点让人非常恼火,所以我在开发机器上还是换回了 ISAPI 模式。

    最后,在 Windows 中以 FastCGI 模式存在潜在的安 

     

    二、php 在nginx 中运行模式(nginx+PHP-FPM )目前理想选择

     

    使用FastCGI方式现在常见的有两种stack:ligthttpd+spawn-fcgi; 另外一种是nginx+PHP-FPM(也可以用spawn-fcgi) 。

    (1) 如上面所说该两种结构都采用FastCGI对PHP支持,因此HTTPServer完全解放出来,可以更好地进行响应和并发处理。因此lighttpd和nginx都有small, but powerful和efficient的美誉。

     

    (2) 该两者还可以分出一个好坏来,spawn-fcgi由于是lighttpd的一部分,因此安装了lighttpd一般就会使用spawn-fcgi对php支持,但是目前有用户说ligttpd的spwan-fcgi在高并发访问的时候,会出现上面说的内存泄漏甚至自动重启fastcgi。即:PHP脚本处理器当机,这个时候如果用户访问的话,可能就会出现白页(即PHP不能被解析或者出错)。

     

    另一个:首先nginx不像lighttpd本身含带了fastcgi(spawn-fcgi),因此它完全是轻量级的,必须借助第三方的FastCGI处理器才可以对PHP进行解析,因此其实这样看来nginx是非常灵活的,它可以和任何第三方提供解析的处理器实现连接从而实现对PHP的解析(在nginx.conf中很容易设置)。

     

    nginx可以使用spwan-fcgi(需要一同安装lighttpd,但是需要为nginx避开端口,一些较早的blog有这方面安装的教程),但是由于spawn-fcgi具有上面所述的用户逐渐发现的缺陷,现在慢慢减少使用nginx+spawn-fcgi组合了。

     

    c. 由于spawn-fcgi的缺陷,现在出现了新的第三方(目前还是,听说正在努力不久将来加入到PHP core中)的PHP的FastCGI处理器,叫做PHP-FPM(具体可以google)。它和spawn-fcgi比较起来有如下优点:

     

    由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,也就是说编译到php core中了,因此在性能方面要优秀一些;

    同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器。具体采用的算法和设计可以google了解。

     

    因此,如上所说由于nginx的轻量和灵活性,因此目前性能优越,越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM

    三、IIS+ ISAPI模式

    这种模式适合开发环境中, 生产环境中用的较少。

     

     

    四、总结


    目前在HTTPServer这块基本可以看到有三种stack比较流行:

    (1)Apache+mod_php5
    (2)lighttp+spawn-fcgi
    (3)nginx+PHP-FPM

    三者后两者性能可能稍优,但是Apache由于有丰富的模块和功能,目前来说仍旧是老大。有人测试nginx+PHP-FPM在高并发情况下可能会达到Apache+mod_php5的5~10倍,现在nginx+PHP-FPM使用的人越来越多。

  • 相关阅读:
    父子进程 signal 出现 Interrupted system call 问题
    一个测试文章
    《淘宝客户端 for Android》项目实战 html webkit android css3
    Django 中的 ForeignKey ContentType GenericForeignKey 对应的数据库结构
    coreseek 出现段错误和Unigram dictionary load Error 新情况(Gentoo)
    一个 PAM dbus 例子
    漫画统计学 T分数
    解决 paramiko 安装问题 Unable to find vcvarsall.bat
    20141202
    js
  • 原文地址:https://www.cnblogs.com/ycookie/p/6708017.html
Copyright © 2011-2022 走看看