免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4814 | 回复: 14
打印 上一主题 下一主题

请教 modcgi modperl fastcgi 运行原理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-17 12:04 |只看该作者 |倒序浏览
很多文章介绍  modcgi modperl fastcgi 但是都只简单提到 跟cgi的比较 不用每次打开一个进程 具体的原理都说的很含糊

希望哪位能给纠正一下理解上的错误

我现在的理解如下

原理:
  1. modcgi 使用 registry 方式  相比cgi减少每次 引导和编译的开销
  2. modperl 使用 handler 方式 底层是xs的 所以 比 modcgi更快

    apache唤醒 modcgi 和 modperl的方式是基本一样的

    客户1 -> 创建httpd进程 -> modcgi or modperl) -> httpd 挂起
    客户2 -> 唤醒 客户1产生的 httpd + mod(cgi perl) -> httpd 挂起
   
  3. fastcgi是个进程池
  
      客户1 -> httpd 进程池  
                                          -> 有http进程-> 处理cgi -> httpd 挂起
      客户2 -> httpd 进程池


使用:
   1. modcgi 就是普通的cgi加上 ModPerl::Registry 或 ModPerl:erlRun   (cgi程序要避免闭包等问题)
      http.conf 的设置 使用
        PerlResponseHandler ModPerl::Registry
      
   2. modperl 一般使用模板 catalsyt mason 等 或者自己实现
       http.conf 的设置 使用
          catalsyt :PerlResponseHandler mysite
          mason  : PerlHandler  HTML::Mason::ApacheHandler
          自己实现 :PerlResponseHandler Apache2::mysite  

   3. FCGI::Engine 等

论坛徽章:
0
2 [报告]
发表于 2009-09-18 08:30 |只看该作者
fastcgi 应该是基于线程的吧

论坛徽章:
0
3 [报告]
发表于 2009-09-18 09:40 |只看该作者
原帖由 hotsnow 于 2009-9-18 08:30 发表
fastcgi 应该是基于线程的吧


请您不要误导我


  1. FastCGI 应用程序将处理 HTTP 请求,每个应用程序都由进程池集合组成。在池中,每个进程一次处理一个请求,处理完毕后返回池中,直至其收到另一个请求。
复制代码


出处  http://technet.microsoft.com/zh- ... 072%28WS.10%29.aspx

论坛徽章:
0
4 [报告]
发表于 2009-09-18 12:06 |只看该作者
perl的fastcgi实现较差,我看过一个别人的代码,就是一个永久循环驻留在apache进程里。
modperl与cgi相比,其实也只是节省了perl脚本Load和compile的开销。
当然,modperl的handler可以直接访问apache的内部API,效率比CGI高,也可以做一些CGI不能做的事,例如rewrite请求。

论坛徽章:
0
5 [报告]
发表于 2009-09-18 12:19 |只看该作者
原帖由 兰花仙子 于 2009-9-18 12:06 发表
其实也只是节省了perl脚本Load和compile的开销。


能展开详细讲讲 怎么节省的开销吗?

尤其是compile的开销怎么节省的

[ 本帖最后由 hitsubunnu 于 2009-9-18 12:20 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-09-18 12:23 |只看该作者
原帖由 hitsubunnu 于 2009-9-18 12:19 发表


能展开详细讲讲 怎么节省的开销吗?

尤其是compile的开销怎么节省的


modperl只会load脚本一次,然后compile一次,就常驻内存运行,类似于一个daemon,直到这个进程退出。
CGI在每次request过来时,都会从磁盘load脚本并compile。
modperl相对于CGI,节省了每次编译的开销。我说的是这个意思。

论坛徽章:
0
7 [报告]
发表于 2009-09-18 13:01 |只看该作者

  1. 1. modcgi 就是使用 registry 方式的modperl
  2. 2. modperl 就是使用 handler 方式 的modperl  

  3.     apache唤醒 modcgi 和 modperl的方式是基本一样的  但是 handler 方式 底层是xs的 所以 比  registry 方式更快

复制代码


可以这样理解吗?

论坛徽章:
0
8 [报告]
发表于 2009-09-18 13:55 |只看该作者
原帖由 hitsubunnu 于 2009-9-18 13:01 发表

1. modcgi 就是使用 registry 方式的modperl
2. modperl 就是使用 handler 方式 的modperl  

    apache唤醒 modcgi 和 modperl的方式是基本一样的  但是 handler 方式 底层是xs的 所以 比  registry 方 ...


sorry,我search了下CPAN,没发现modcgi呀。。。
你是指Apache的mod_cgi?还是就是指CGI?

CGI与modperl Registry在实现方式上没什么区别,因为Registry本就是用来跑CGI的。
CGI与标准mod_perl最大的区别在于执行的HTTP阶段不同。
mod_perl可以执行在HTTP的任何阶段(一个请求处理可以分成N个阶段)。
但是到CGI时,已经很晚了。而且给CGI传参是通过环境变量的方式,比较低效。

论坛徽章:
0
9 [报告]
发表于 2009-09-18 16:33 |只看该作者
不好意思 我就是因为看的资料很杂 我自己拼接在一起的 所以对modperl的运行机制很混乱才发问的

兰花仙子的意思可以理解为下面这样吗?
   虽然我在http.conf 里 配置成了 PerlResponseHandler ModPerl::Registry这种形式  但是我在写程序时仍使用use CGI模块等写出的程序  其实质就是最原始的cgi程序 不会对 Load和compile的开销起任何作用

我的理解(劳烦您纠正)
modperl最常见的有2种形态:handler和registry

1. 我以为很多地方提到的modcgi就是指  运行在 modperl的registry形式下的 用use CGI模块等写出的程序  http.conf 的设置时 使用 PerlResponseHandler ModPerl::Registry  写法上跟普通cgi基本一样但是需要避免一些闭包等等。。  这种形式跟最原始的cgi是有区别的 也是可以节省了perl脚本Load和compile的开销    一般原始cgi要想移植到modperl下 都采用这种模式

2. handler是比registry更高级的一个层次 是利用apache的底层进行开发 可以在http的12阶段实现任何事情但是很复杂  一般都是使用 catalyst mason 等  在http.conf里设置成 PerlHandler  HTML::Mason::ApacheHandler
这种形式     当然也可以自己编写 类似 Apache2::Hello 但是自己编写比较麻烦

如果您看不懂我的表述 或者我的理解有很大的偏差 请帮忙回答2个问题
  1. 最原始的cgi要想 移植到 modperl下 是通过 ModPerl::Registry  吗 当然要按照规范写   这种移植性能上有提升吗?
  2.registry 和 handler 的区别 ?

[ 本帖最后由 hitsubunnu 于 2009-9-18 16:35 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-09-18 16:51 |只看该作者
apache那么复杂的配置,搞懂它都不容易。

直接使用lighttpd + fastcgi,我觉得又简单又方便,功能和功能都能满足要求。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP