[原创]用MP技术开发APACHE API程序
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