首页 > 学技术 > 技术网文 > Web服务器 > 正文

[原创] [原创]用MP技术开发APACHE API程序


来源 chinaunix.net 酷勤网整理

Perl语言产生自18年前,Perl语言作者因此得到了全球第一届开源大会的奖。Perl无处不在,当你在为APACHE安装扩展的时候需要Perl,甚至

在有的时候你给PHP安装扩展的时候也需要PERL。虽然有的系统说已经可以不需要Perl解析器了,不过那样只会给用户增加负担。Perl语言与其

他开源语言最大的区别在于Perl语言有这几点:17年的历史技术稳定成熟、Perl语言支持超过85种以上操作系统、Perl语言拥有超过8000个模

块的强大资源库、全球每发行一套Linux几乎都会捆绑一套Perl。

使用MODPERL跑高速网络应用程序。MODPERL可以方便的开发APACHE API接口程序,适合高访问量的专用系统,编码难度与普通CGI基本相同。运

行速度仅比API C略逊一些,不过这些不要紧,因为API C的代码写起来要消耗非常多的时间。

一、MODPERL技术的介绍
MODPERL技术将PERL解析器编译到APACHE服务器中一起等待客户端请求。
MODPERL技术在APACHE中一共有三种代码运行方式:
PerlRun模式:这个模式主要兼容旧式CGI程序,仅仅使用APACHE中的PERL解析器对代码进行解析不进行缓冲。
Registry模式:这个模式的Perl代码在被访问过以后会被编译成为APACHE API模块并且存储在缓冲之中,为了保证运行APACHE会选择性的产生

不只一个副本在内存中。
APACHE API模式:这个模式在APACHE启动的时候就直接将代码编译驻留在缓冲之中。

二、安装MODPERL
强烈推荐以静态编译模式安装MODPERL到APACHE中,这样可以防止内存的泄露问题。安装步骤这里不废话了,一般的如果是APACHE1请采用最新

版的MODPERL,如果是APACHE2请选择最新版的RC版MODPERL。

三、编写APACHE APi代码
example.pm:
package example;

use strict;
use Apache::Request;
use Apache::Constants qw(:common);

sub handler {
  my $r = shift;
  my $req = Apache::Request->;new($r);

  $req->;send_http_header('text/html');
  $req->;print('Hello World!');

return OK;
}
在HTTPD.CONF里做以下设置:
PerlModule example;
<LocationMatch "(service)$">;
        SetHandler perl-script
        PerlHandler example
</LocationMatch>;
这样当用户访问http://yourhost/service的时候会被这个APACHE API处理

四、技术解决方案
1.Apache::Reload
当这个API被驻留内存后简单的更新程序内存中的内容不会有变化,除非你重新启动apache如果这是开发期对你来讲很糟糕的。使用APACHE便可

监视代码修改。

2.Apache::DBI持续性数据库连接
这个模块提供了持续性数据库连接。他会跟随你的API代码在内存中产生连接池等待客户端发送请求。使用这个模块与使用DBI数据库连接模块

一样简单。

3.Apache::Request获得用户的请求
请不要使用CGI.pm模块,使用Apache::Request代替它的工作,这个模块可以方便的获得用户提交表单,而且你不需要去考虑是GET还是POST来

的数据。
sub handler {
        $APACHE         = shift;
        $REQUEST        = Apache::Request->;new($APACHE);
        $FORM           = $REQUEST->;param(); 
}

4.Apache::cookie获得COOKIE
        $COOKIE         = Apache::Cookie::fetch($REQUEST);

5.Apache::Upload获得用户上载文件

6.Cache::Cache进行缓存
如果你的系统希望速度快,可能需要用到缓存技术。Cache::Cache模块提供了三种缓存技术:单进程内存缓存储、不同进程内存共享缓存、文

件缓存。
$cache->;set('cachename','cachedata','24h');
$cache->;get('cachename');

7.路径敏感
为了安全性MODPERL的代码默认路径是/dev/null。这个时候会引起一些麻烦。如果想得到程序运行的真正路径可以使用__FILE__来得到:
use File::Basename;
$current_dir = __FILE__;        $current_dir = dirname($current_dir);
另外APACHE默认会在除了传统目录外的apache/和apache/lib/perl里寻找你的APACHE API所以如果你不想放在那里你可以把PerlModule修改成

为PerlRequire "/path/example.pm"

8.重定向
Apache::Request模块会帮助你进行重定向,由于与APACHE配合紧密分为两种:一种是内部的、一种是外部的Location模式。
$r->;internal_redirect($new_uri);

9.其他内部方法
lookup_file 查看文件是否存在
lookup_uri 查看路径是否存在
请查看perl.apahce.org的资源

10.动态虚拟主机
如果你是一个大型虚拟主机网,你可以把虚拟主机数据存储在RAID上,前端有多台无人职守服务器,都是用PERL做的动态虚拟主机。在美国一

个服务器上有有1万个虚拟主机配置。总不能都写到httpd.conf里吧?
   sub trans_handler
     {
        my $r = shift;
        my ($user) = ($r->;header_in('Host') =~ /^[^\.]+/);
        $r->;document_root("/home/$user/www");
        return DECLINED;
     }
    
   PerlTransHandler trans_handler

11.一切资源
search.cpan.org可以找到所有这些模块和说明。
perl.apache.org有详细的modperl文档和modperl的安装包。
另外有三本厚度超过300页的英文MODPERL解决方案书,可以在amazon购买,只要你有信用卡就可以。
www.perlchina.org可以和我们一起讨论modperl技术。
如果你有QQ可以连接Perlchina的QQ群
如果你有IRC可以加入irc.freenode.org的#perlchina房间
另外,Perlchina的四个QQ群和IRC之间是互通互连的,你加入任何一个都可以找到所有人,感谢Perlchina的alexe开发这个交换机。


谢谢大家能观看这篇文章。希望Perl能帮助你的工作。
如果这些和perlchina对您的公司有帮助 希望您能赞助我们fund.perlchina.org。

hoowa sun
2005.7.17



 raullpq 回复于:2005-07-19 09:57:27

不错! 正在潜心学习这方面!

http://www.perlchina.org也是常去的好站点!


 hoowa 回复于:2005-07-19 20:33:19

欢迎多去perlchina啊。也欢迎多到cu的perl版,也欢迎多到cu的linux时代。

perl开发apacheAPI的好处就是比C要简单。呵呵。


顺便加上一句,如果使用APACHE的内部重定向要注意,这个internal_redirect会把你的POST数据一起从重定向的,这样可能导致把数据错误的提交给了HTML导致405错误。呵呵




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=578715
转载请注明作者名及原文出处



收藏本页到: