当前位置: 代码迷 >> 综合 >> php安装模式cgi,fastcgi,php_mod比较
  详细解决方案

php安装模式cgi,fastcgi,php_mod比较

热度:61   发布时间:2023-12-15 10:28:30.0

安装php又面临到了模式的选择,以前都是选择mod_php模式,因为这样安装比较方便哈,今天突然关心起FastCGI这种模式,败毒了一把,找到了一些关于mod_php和Fastcgi的选择与对比这方面的讨论,现在发出来留一个记号,以便进一步研究:

第一篇:php在apache中安装模式的区别:fastcgi和mod_php

     说到fastCgi就不得不说Cgi。
     CGI英文全称是 Common Gateway Interface,通常翻译为共同网关接口,是HTTP服务器与机器上的其他程序进行通信的一个接口。这个“其他程序”可以使用任何计算机语言来编写,它通过CGI这个接口从HTTP服务器取得输入,然后把运行的结果又通过CGI这个接口交给HTTP服务器,而HTTP服务器把这个结果送给浏览器。

     CGI的出现让WEB从静态变为为动态,随着Web的越来越普及,很多的网站的都需要有动态的页面,以便与浏览者互交。CGI方式的缺点也越来越突出。因为HTTP要生成一个动态页面,系统就必须启动一个新的进程以运行CGI程序,不断地fork是一项很消耗时间和资源的工作。这就出现了FastCGI。

   百度百科关于FastCGI


 2. FastCGI 可在任何平台上使用,Netscape Enterprise 及 IIS 都有 FastCGI 的模块可供使用,阿帕契 (Apache,以及利用 Apache 衍生出做的服务器) 上也有 mod_fastcgi 可用。
 3. FastCGI 支持 C/C++,Ruby, Perl,Tcl,Java,Python 等程序语言。
 4. FastCGI 的应用程序亦兼容于 CGI。即 FastCGI 的应用程序也可以当成 CGI 来执行。
 5. 现有的 CGI 程序要改写成 FastCGI 非常简单,最少可能只需要多加入三行程序代码。
 6. FastCGI 的侦错方式与 CGI 大同小异,只要带入程序所需的环境变量及参数,即可在命令列模式执行或侦错。
 7. FastCGI 应用程序的写作方式与 CGI 类似,除了几项原则要特别注意外,FastCGI 的写作方式跟 CGI 几乎一样,与学习 Web Server API 比较起来, FastCGI 简单多了。
 8. FastCGI 支授分布式运算 (distributed computing),即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

     mod_php就是把PHP做为APACHE一个内置模块。让apache http服务器本身能够支持PHP语言,不需要每一个请求就启动PHP解释器来解释PHP。

第二篇:mod_php or fastcgi性能比较与选择

用php肯定少了不这个问题的选择,cgi自然就不必说了,但是mod_php和fastcgi的争论确还是比较多的。
找了一些资料,晾在这,可供参考。
首先,性能应该是大家最关心的问题了,除了mod_php和fastcgi 的 benchmark,还有一些服务器差别的测试,如apache vs lighthttpd

mod_php, LightTPD, FastCGI - What’s fastest?
     这个bechmark的结果是 Apache(prefork)+Fastcgi+php的性能是最好的。超过了apache+mod_php,甚至也超过了lightty+fastcgi+php。当然,这个结果得出值相差都很小。另外,以上说的几个结果都使用了APC加速,使用APC后性能提高1倍以上。

php4-mod-vs-cgi
   这个bechmark是在php4的环境下完成的。其summary.txt的内容如下。


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

PHP4 module, very simple script (phpinfo.php): requests/s
plain 130.04
+turckcache 129.42
+turckcache+zend-optimizer 125.50

PHP4 module, very complex script (insurance application): requests/s
plain 1.84
+turckcache 6.23
+turckcache+zend-optimizer 5.58
+optimizer 1.58

PHP4 CGI, very simple script (phpinfo.php): requests/s
plain 22.69
+turckcache n/a*
+turckcache+zend-optimizer n/a*
+optimizer 21.23

PHP4 CGI, very complex script (insurance application): requests/s
plain 2.00
+turckcache n/a*
+turckcache+zend-optimizer n/a*
+optimizer 1.72

* = turkcache doesn't support caching of the PHP scripts in CGI mode

上面的结果我觉得需要关注的是无cache的情况,因为使用mod_php或fastcgi主要还是用来生成动态页面。前面的cache有更好的工具来实现,如squid。所以,这个结果也是fastcgi胜出,相差也不大。

http://buytaert.net/drupal-performance?page=1
   这个文章的结果和上面两个刚好相反。使用fastcgi代替mod_php后,”When switching from

to

we observe a 63% slowdown for anonymous visitors, and a 18% slowdown for authenticated visitors.”以下是图表

另外,benchmark中也做了和lightty的比较,如下图:

这个文章的结论是Apache+mod_php性能好于Apache+fastcgi。另外,Apache+mod_php略好于lightty+fastcgi。

4 最后看看 fastcgi官方自己怎么说的吧
    Of course, the answer is that it depends upon the application. A more complete answer is that FastCGI often wins by a significant margin, and seldom loses by very much.

5 结论是,还是根据自己的应用测一下吧….

最后,个人观点
如果mod_php和fastcgi的性能相差不是很大的话,还是倾向于fastcgi的,这种方式毕竟更灵活、安全和简单。
1 使用fastcgi,你的web server 可以比较简单的切换,可以测试不同的服务器,Apache,lightty,ngix 等等,不需要有代码的修改
2 如果想换脚本的实现,如不用php,而是改成perl,python之类的,web服务器也不需要任何的改动
3 web server和fastcgi可以用不同的帐号运行,带来了一定的安全隔离
4 只在Apache中编个mod_fastcgi可以说是简单多了,把mod_php编进apache时,出问题时很难定位是php的问题还是apache的问题,我就见过这样的core,函数调用几十层,一点头绪都没有














========================================================================================================








先了解一下普通cgi的工作流程:
web server收到用户请求,并把请求提交给cgi程序,cgi程序根据请求提交的参数作相应处理,然后输出标准的html语句返回给web server,web server再返回给客户端,这就是普通cgi的工作原理。

从 上面看,cgi所要实现的不过是动态网页而已,这种处理方式的特点就是每接到一个请求,web server都要fork出一个单独的cgi程序的进程来处理,这种方式的好处是把web server和具体的程序处理独立开来,结构清晰,可控性强,同时缺点就是如果在高访问需求的情况下,cgi的进程fork就会成为很大的服务器负担,想 象一下数百个并发请求导致服务器fork出数百个进程就明白了。这也是为什么cgi一直背负性能低下,高资源消耗的恶名的原因。

相应的有问题就有解决方案,目前流行的方案就是使用模块设计,基本上目前的web server都有相应的模块机制来扩充它的

功能, 只要按照其设计规范设计出来的模块,就能插入到web server自身的进程处理,因此性能有很大改观,例如IIS的isapi,apache的dso。但是,这种方法也不是没有缺点的,例如对于不同的 web server,要按照不同标准开发,无法做到webserver无关性;例如这将输入验证的工作转交给了web server,没办法自由处理;例如一旦出现问题将影响整个web server处理流程;例如插入web server进程导致的无法以多用户标示运行,无法处理虚拟主机权限等。

所幸我们还有另外的选择,这就是fastcgi。 fastcgi是基于cgi架构的扩展,他的核心思想就是在web server和具体cgi程序之间建立一个智能的可持续的中间层,统管cgi程序的运行,这样web server只需要将请求提交给这个层,这个层再派生出几个可复用的cgi程序实例,然后再把请求分发给这些实例,这些实例是可控的,可持续,可复用的, 因此一方面避免了进程反复fork,另一方面又可以通过中间层的控制和探测机制来监视这些实例的运行情况,根据不同的状况fork或者回收实例,达到灵活 性和稳定性兼得的目的。


本人曾经做过测试,使用cgi方式运行php效率最差,mod_php方式性能非常不错,几乎是cgi方 式的50倍,但是无法保证虚拟主机站点的安全性隔离,而fastcgi性能则基本和mod_php相当,这还是在使用了suexec切换虚拟主机站点运行 用户的情况下的结果。

fastcgi与cgi的区别

先讲下cgi:
cgi在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会把根据这次请求的内容,然后会fork一个新进程运行外部c程序 (或perl脚本...), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。

后来出现了一种更高级的方式是, web服务器可以内置perl解释器或php解释器。 也就是说这些解释器做成模块的方式,web服务器会在启动的时候就启动这些解释器。 当有新的动态请求进来时,web服务器就是自己解析这些perl或php脚本,省得重新fork一个进程,效率提高了。

fastcgi的方式是,web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退 出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回 给web服务器,最后自己接着等待下一个请求的到来,而不是退出。 
fastcgi跟cgi的区别是:
                  在web服务器方面                                                          在对数据进行处理的进程方面 
cgi
         fork一个新的进程进行处理                                           读取参数,处理数据,然后就结束生命期
fastcgi    用tcp方式跟远程机子上的进程或本地进程建立连接       要开启tcp端口,进入循环,等待数据的到来,处理数据


举个例子: 服务端现在有个10万个字单词, 客户每次会发来一个字符串,问以这个字符串为前缀的单词有多少个。 那么可以写一个程序,这个程序会建一棵trie树,然后每次用户请求过来时可以直接到这个trie去查找。 但是如果以cgi的方式的话,这次请求结束后这课trie也就没了,等下次再启动该进程时,又要新建一棵trie树,这样的效率就太低下了。   而用fastcgi的方式的话,这课trie树在进程启动时建立,以后就可以直接在trie树上查询指定的前缀了。

[问1] 
我也是 c cgi 的坚定支持者,而且亲自试验过 FastCGI 的稳定性和高性能。但是很长时间我也没查明白:为什么现在使用 cgi 的网站那么少,FastCGI 更少了? 

[答1] 
你这个问题问的非常好, 
都知道 CGI 只是个技术标准(目前使用的是 CGI/1.1), 因为该标准非常简单所有它很容易用各种高级语言和脚本语言进行描述; 但它也给 CGI 开发者带来了困难, 那就是过去没有非常好的开发工具以开发方便开发者开发复杂的应用. 很多时候它们不得不手工 printf 输入每一句 html 语句. 这样严重限制了传统 cgi 的发展;

与此同时, 另一批工具(暂时称之为泛 CGI吧), 如 asp, jsp, php, 它们继承了 CGI 标准的简单性, 同时提供了相应的解释或编译工具. 通过这些工具, 开发人员只要在 html/xml 模板文件中嵌入相应(脚本)语句即可, 特别是 asp.net 开发环境, php 之后的模板技术等, jsp 等 strust 框架等都为开发人员提供了更为抽象化的开发工具, 使开发人员彻底忘记了它们(asp, php, jsp等)的前身 CGI (之所以称它们为泛 CGI, 因为它们都是 CGI 技术的继承和发展者).

[问3] 
php的性能是因为成了服务器的模块,但是 c cgi 也能编写成模块的模式,特别是 FastCGI 天生几乎就是服务器的模块,可是为什么用的人那么少呢?
而且我自己的试验证明,FastCGI 极稳定,不稳定基本是程序没编写好,有内存泄露、忘记重置等问题造成的.
 


[答3] 
PHP 也可以作为 CGI 运行, 同时也支持 FastCGI.
php 性能是因为成了服务器的模块, 这导致 php 非常依赖服务器, 所以通常 php 只在 apahce 服务器具有非常好的性能, 换个 webserver 甚至它是不能运行的. 严格遵守 CGI 标准的应用工具应该是不存在这些问题的. 
不过, 在适当的应用中, 为了性能牺牲一些特性为是必要的.

对 FastCGI 要有充分的信心, FastCGI 没有问题, 在很多应用中证明它都有很好的表现.
前面提及, 用的少主要原因是在 CSP/eybuild 之前大家没有很好的编写复杂应用的 CGI 开发工具.

[问4] 
实际应用上,多数人会选择 apache 或 IIS ... 

[答4] 
WEB 服务应用领域是主要用这两个服务器, 不过其它 web 应用(如设备管理/控制等), 使用的 webserver 就很广泛了, 如 thttpd, mini-httpd, goAhead, lighttpd, boa, ...
它们可能还要运行在不同的 CPU 架构(如 inter, xscale, arm, mips, ...)下, 不同的存储器限定环境中(如只有 2M, 8M, 16M的内存) 无硬盘, 只有几M的 flash 等, 
这些环境的应用中, 目前最主要的 web 开发语言都是 c, ...

[问5] 
我认为随着ajax应用的普及,模板技术有逐渐被取代的趋势 

[答5] 
ajax 是一种非常不错客户端技术, 通在不刷新整个页面的情况下给用户带来很新体验. 它服务器端的技术互相补充相互依赖, 从目前的形式看, 还很难说谁会取代谁的趋势. 根据项目和应用不同, 开发者应该灵活选择它们要选用的开发工具和开发技术, 并进一有效的融合, 不宜单纯一味追求某一技术.

[问6] 
web标准客户端的结构、表现、行为分离,确实是好框架,是发展趋势,而且能简化服务器端开发。我认为随着应用的普及,模板技术会被取代。那时候,开发服务端只要编程就可以了,完全脱离页面的束缚。 


[答6] 
呵呵, W3C 关于 结构、表现、行为分离 确实极大地推动了 web 技术的发展, 
但它主要是指结构-(html)、表现(css)、行为(js) 三者的分离, 是一种客户端技术, 与取代模板关系不大.
一般认为 ajax 的目标把富客户端, 弱服务器, 它可能对 服务器端的模板技术有一对冲击.


1,2 C/C++本身的模板技术已经足够了。 论坛里面我写过一个模板能满足99%的cgi开发
而java的一些框架和技术,是其他产品无法或者难以替代的
3,4 错误,php比c cgi更适应各种平台。什么情况会只有2m内存,硬盘? 也只能适合嵌入式了
5.6 ajax 技术不能代替任何现有的,对google的盲目崇拜而已。ajax被用在很多不适合的地方, 大多又都带来加大服务器消耗的代价

使用FastCGI只会愈来愈少。





====================================================================================================
如何在Win7系统配置PHP+MySQL+Apache

确定两点:
1、下载正确的32位软件。
2、一步步安装。那么既然是64位的系统我们就必须去照64位的软件,我可以告诉你,apache 和 php 官网上面的软件都只有32位的。Mysql是有64位的。64位的软件都是牛逼的团队或者个人自己改编的。首先mysql 64的官网下载地址:http://dev.mysql.com/downloads/mysql/5.1.html
这里先对这些软件的格式说一下,一般都只有两种格式,一种是msi,另外一种是zip。
Msi格式跟exe文件差不多,就是点击后安装的。而zip格式是你解压以后通过cmd里面命令进行安装,然后配置文件里需要你自己配置的东西比较多。我搭建的时候apache和php是zip文件,然后mysql下的是msi文件。
接下来先去看一下php官网,显然php官网上没有我们需要的64位软件。可它却提供了64位apache和一些apache模块的下载地址:
http://www.apachelounge.com/download/win64/
先回到php官网,他有很多版本,vc6,v9,Threadsafe, not Thread safe的。我很多次下错版本就是因为这些。细心的人可以发现网站的左边对版本进行了解释。VC6的版本是用 Visual Studio 6编译的,这个是八几年的软件了,所以现在php 5.3.2以上的版本几乎都没有VC6了。可是官网又说:如果你用apache那就要用VC6,IIS的话就用 VC9,而且还强调不要在 apache上用VC9。我估计这句话是很老时候的了,一直没没更新。我的经验是:VC6是老版本了,你可以无视它了。所以都用VC9,VC9有两个版本,一个是线程安全,一个是不安全。如果你apache用的是 fcgid方式运行,那么就用不安全的,如果你用的是传统php5apache2_2模式的你就下载安全的。下载了VC9 不安全的解压后里面是没有php5apache2_2.dll文件的,并且应该有php.exe文件。这个的话apache就必须配置成mod_fcgid方式运行,那么就必须下载mod_fcgid模块,下载地址也是:http://www.apachelounge.com/download/win64/
下载之后把mod_fcgid.so文件复制到apache的moudle文件夹下,然后再对apache的http.conf进行配置。配置方法我在最后统一写吧。而下载VC9安全的解压之后是有php5apache2_2.dll文件的。安装这种方式运行apache那么你也不需要去下载mod_fcgid.so了。那么先去上面的网站把64位的apache下载下来,我下的是zip格式的。现在我们缺少的就是64位php了。这个大家自己去网上搜索吧,因为虽然有两个网站专门有64位的php,可最近都在维护还是怎么地,反正不能下载,但在网上都能找到的。比如csdn上就有最新版的php5.4.6 VC9 64位的。还有用到两个辅助软件,一个是phpmyadmin,另一个是zend optimizer。前者是mysql的辅助工具,后者是加速php程序的。这些大家去找地方下载吧。安装Apache 64位
apache-2.2.19-win64.rar解压到某一目录,如D:\Apache2.2。
编辑配置文件D:\Apache2.2\conf\httpd.conf作如下修改
改为 
Listen 80 改为 
Listen 8080# 端口,若已开启IIS,则80端口就不能使用了
DocumentRoot "/httpd-2.2-x64/htdocs"改为 
DocumentRoot "D:/Apache2.2/htdocs"# 放置网站文件的路径
DirectoryIndex index.html改为 
DirectoryIndex index.html index.htm index.php # 加入index.php,PHP的默认页
ScriptAlias /cgi-bin/ "/httpd-2.2-x64/cgi-bin/"改为
ScriptAlias /cgi-bin/ "D:/Apache2.2/cgi-bin/"
<Directory "/httpd-2.2-x64/htdocs">改为
<Directory "D:/Apache2.2/htdocs">
<Directory "/httpd-2.2-x64/cgi-bin">改为
<Directory "D:/Apache2.2/cgi-bin">
将LoadModule rewrite_module modules/mod_rewrite.so前的#去掉
将include /_httpd/test.conf一行去掉
apache都这样配置。
3、执行安装命令:
进入D:\Apache2.2\bin
执行命令:httpd.exe -k install(将apache加入系统服务,默认服务名是Apache2.2)
执行命令:httpd.exe -k start(运行服务)
以后可以使用D:\Apache2.2\bin\ApacheMonitor.exe进行服务的开启、关闭、重启与监控等操作
4、 测试安装是否成功
打开浏览器,输入:http://localhost:8080,显示 It Works! 说明成功!1. 将下载的php安装包php-5.3.10-x64.zip解压到某一路径下,如D:\PHP2. 修改配置文件D:\Apache2.2\conf\httpd.conf
在#LoadModule vhost_alias_module modules/mod_vhost_alias.so一行下加上:
LoadModule php5_module "D:/PHP/php5apache2_2.dll"
PHPIniDir "D:/PHP"在AddType application/x-gzip .gz .tgz下加上:
AddType application/x-httpd-php .php
AddType application/x-httpd-php .html # .html, .php为可执行php语言的扩展名3. 将如下文件复制到C:\Windows\System32下
D:\PHP\php5ts.dllD:\PHP\php5isapi.dllD:\PHP\php5apache2_2.dllD:\PHP\ext\php_mysql.dllD:\PHP\ext\php_mysqli.dllD:\PHP\libmysql.dll
mod_fcgid方式运行Apache,那么先将mod_fcgid.so文件复制到apache下的moudle文件夹,然后配置httpd.conf:
的存放目录
设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程在处理完所有请求前退出
每个进程的最大请求数
最大的进程数
最大执行时间
的路径
4、之后不管是哪种方式都打开D:\PHP\php.in。如果没有的话将D:\PHP\php.ini-recommended复制为D:\PHP\php.ini,并作如下修改
修改extension_dir = "./"为
extension_dir = "ext" # 指定动态连接库的目录
将extension=php_mysql.dll前的分号(注释)去掉
5. 测试是否安装成功
修改D:\Apache2.2\htdocs\index.html文件,加入:<?php echo phpinfo(); ?> 
重启httpd服务输入网址:http://loalhost:8080 ,看到php信息,说明成功!
为了能自定义安装位置选择‘Custom’
选择安装路径,并且点击图标选择‘Entire feature willbe install on local hard drive’,能够点的都选择这个选项。注意有两个路径要填写,一个是软件安装,一个是数据存放路径。
安装完了会出现一个配置界面 ‘launch the mysqlconfiguration wizard’对mysql一些参数进行配置。
第一个选择‘DetailedConfiguraion’,详细配置。
5、‘DeveloperMachine’‘Dedicated mysql server machine’‘Server Machine’ 选择MYSQL作为什么类型运行,一般网站的话都是‘Server Machine’
6、对Mysql速度和存储量进行选择,一般选择中庸的‘MultifunctionDatabase’
7、InnoDBTablespace Settings。这个默认即可。
8、下面设置访问MYSQL的人数,选择‘ManualSetting’之后自己选择数字。最大是1400人。根据你的网站实际访问量进行设计即可。
9、‘Enable
TCP/IP Networking’这个必勾选,端口默认3306。‘Add firewall exception for this port’随意。‘Enable Strict
Mode’建议不勾选,严格遵守SQL语言。
10、选择默认字符集,相对常用的是UTF-8。
11、‘Install A是WindowsService’勾选。自动开启这些都勾选。
12、‘Modify
Security Settings’勾选,设置密码。‘Enable root access from remote machines’允许在其他电脑上运城链接MYSQL,建议不勾选。‘Create
An Anonymous Account’建立一个普通用户。
13、最后‘Exexute’完成!
正常情况下这样就按照完毕了,如果出现失败的有可能是因为以前的MYSQL没卸载干净。D:\Apache2.2\htdocs,可就是网站根目录,当然你也可以放在其他地方。把文件夹名字换成 phpMyAdmin,编辑配置文件D:\Apache2.2\htdocs\libraries\ config.default.php。
配置很简单,上面那些基本的配置完就能在浏览器里输入 http://localhost/phpmyadmin就能访问了。
zend optimizer安装就更简单了,只要选择一些php.ini的文件夹路径,apache文件夹的路径等就可以了。、









  相关解决方案