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

王朝厨房·作者佚名  2007-01-05
宽屏版  字体: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有