Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->编程语言 ->CGI ->实战 FastCGI
  相关分类: 
ASP
ViualBasic
UML / Rational Rose
PHP4/PHP5
Perl
JAVA/JSP教程
Delphi
ColdFusion
CGI
C/C++
ASP.NET
XML
  站内搜索: 
热门文章排行
热门文章排行 windows下Perl开发环境的安装和配置(04-28)
perl与Mysql连接(04-28)
实战 FastCGI(04-28)
获取随机的密码(04-28)
perl模块和包的使用(04-28)
精采文章排行
精采文章排行 CGI教学:CGI常用环境变量(04-28)
关于CGI读写COOKIE的编程(04-28)
CGI的安全(二)(04-28)
CGI的安全(一)(04-28)
获取随机的密码(04-28)
  ·关于CGI读写COOKIE的编程·CGI的安全(二)·CGI的安全(一)·获取随机的密码·在CGI中实现session的想法和实现·CGI绝对路径和相对路径的简便设置方法·使用脚本下载网页·利用Perl开发Internet/Intranet应用之二(·利用Perl开发Internet/Intranet应用之二(

实战 FastCGI

作者:Webmaster   来源:Linuxdby.com   点击:   日期:2007-04-28 [收藏] [投稿]

  IE是否经常中毒?推荐您

3.4 炼结 libfcgi.a 函式库
FastCGI 程序要炼结到 libfcgi.a 函式库才可正确产生出执行档,假设 libfcgi.a 的位置在 /usr/local/lib 这个目录下,我们在编译 (炼结时) 要加入 -L/usr/local/lib -lfcgi 的参数。

$ cc -o program.fcg program.o -L/usr/local/lib -lfcgi

3.5 撰写 FastCGI 程序的注意事项
由于 FastCGI 程序被激活后就常驻在内存之中,对每个 FastCGI 的执行行程 (running process) 而言,每次联机请求共享的变量空间是相同的,因些选写 FastCGI 程序要特别留意一些注意事项。

1. 记住,对每个 FastCGI 程序而言,只有 FCGI_Accept() 循环内的程序才是真正处理每次联机请求的主体,假设在程序中要读取和 CGI 有关的环境变量,或是使用者透过窗体 (form) 所输入的资料,必须在 FCGI_Accept() 循环内才处理。
2. 对每次联机请求会改变的变量,别忘了在处理新的联机请求前把变量初始化 (除非是有特殊用途) ,以避免变量值在不同的联机请求之间互相影响。
3. 在 FCGI_Accept() 循环中配置 (allocate) 的内存别忘了释放 (free)。在一般的 CGI 程序中, Memory Leak 不算是太大的问题,因为每处理完一次联机请求,所有用到的内存随着 CGI 程序的结束也被释放。但是 FastCGI 程序会一直常驻在内存中,如果在 FCGI_Accept() 中有配置额外的内存,在循环结束前没有释放掉,则每处理一次联机请求就吃掉一些系统的内存,多跑几次下来,系统资源大概就被耗光了。Memory leak 的问题是 FastCGI 最常见的错误,要特别小心处理。
4. FastCGI 程序和其所要引用的子程序中,用到 stdio.h 函式的部份,记得要改成 fcgi_stdio.h 。否则当程序在遇到 IO 的动作时就会发生 Core Dump 的情况。
5. 在 FCGI_Accept() 循环中使用 FCGI_Finish() 函式以取代 exit() 函式。原本 CGI 程序中发生错误时,可能直接呼叫 exit() 函式结束 CGI 行程,FastCGI 程序也可以如此,因为 mod_fastcgi 模块在 FastCGI 程序发生错误而意外结束时,会自动再激活另一个 FastCGI 的行程。但比较好的作法是呼叫 fcgi_stdio.h 中的 FCGI_Finish() 函式,呼叫 FCGI_Finish() 函式会跳出目前程序正在运算中的循环,回到 FCGI_Accept() 等待下一个联机请求。如此可以省去一些网站服务器激活新的 FastCGI 行程的负担。

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

4. FastCGI 有多快?

看完安装 FastCGI 的阿帕契模块,以及无聊的程序设计注意事项后,我们来看看一些可以让人振奋精神的数据,效能比较 (bench mark) 总是计算机玩家的最爱 :-)

4.1 评比工具 - ApacheBench
在阿帕契服务器的套件中,有一个叫做 ab (ApacheBench) 的工具。ApacheBench 主要是用来测试阿帕契服务器执行效率用的,我们就以 ApacheBench 做为 CGI vs. FastCGI 的评比工具。

ApacheBench 可以针对某个特定的 URL 仿真出连续的联机请求,同时还可以仿真出同时间点数个相同的联机请求,因此利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真出来的数据做为调整服务器设定或程序的依据。 ApacheBench 的用法如下:

Usage: /usr/local/apache/bin/ab [options] [http://]hostname[:port]/path
Options are:
-n requests Number of requests to perform
-c concurrency Number of multiple requests to make
-t timelimit Seconds to max. wait for responses
-p postfile File containg data to POST
-T content-type Content-type header for POSTing
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-V Print version number and exit
-k Use HTTP KeepAlive feature
-h Display usage information (this message)

假设我们要对 echo.fcg 做测试,仿真 1000 次的联机请求,而且同一时间有 20 个并行的 (concurrent) 联机请求的情况,只要在命令列模式下执行

$ ab -n 1000 -c 20 http://localhost/fcgi-bin/echo.fcg
稍等一会,ApacheBench 会把结果秀出来,

This is ApacheBench, Version 1.3
Copyright ? 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright ? 1998-1999 The Apache Group, http://www.apache.org/

Benchmarking localhost (be patient)… Server Software: Apache/1.3.6
Server Hostname: localhost
Server Port: 80
Document Path: /fcgi-bin/echo.fcg
Document Length: 995 bytes
Concurrency Level: 20
Time taken for tests: 6.859 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 1142000 bytes
HTML transferred: 995000 bytes
Requests per second: 145.79
Transfer rate: 166.50 kb/s received

Connnection Times (ms)
min avg max

Connect: 0 4 61
Processing: 62 128 771
Total: 62 132 832

以上结果指出,在同时间 20 个联机请求 (Concurrency Level) 的情况下,完成 1000 次的联机请求,共花了 6.859 秒 (Time taken for tests),因此这个程序每秒平均可以处理 (Requests per second) 145.79 个联机请求。
在接下来的评比测试中,我们就以每秒可以处理的联机请求数目来做为效能评比的依据。



 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

上一页 1 2 3 4 56 下一页

上一篇:perl调试工具   下一篇:Perl的面向对象编程
文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论

   相关文章:
·CGI教学:CGI常用环境变量

   文章评论:(1条)
  
 请留名: 匿名评论   点击查看所有评论 论坛讨论
 

 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。