脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - perl - 不错的mod_perl编程的简单应用实例介绍

不错的mod_perl编程的简单应用实例介绍

2020-05-29 13:49脚本之家 perl

mod_perl 是个庞大而复杂的工具,它内建了许多模块帮助你方便地构建动态网站。这篇指南的目的是帮助你构建一个良好的 mod_perl 模块,并从中理解 mod_perl 的实现技术。我并不推荐使用这里介绍的技术来建立一个大型站点,尤其对于

介绍性指南

mod_perl是个庞大而复杂的工具,它内建了许多模块帮助你方便地构建动态网站。这篇指南的目的是帮助你构建一个良好的mod_perl模块,并从中理解mod_perl的实现技术。我并不推荐使用这里介绍的技术来建立一个大型站点,尤其对于一个刚刚涉足mod_perl的人来说。但我推荐大家可以深入看一下它的一些内建的方案,比如Mason,AxKit,EmbPerl,Apache::ASP和PageKit等等。

你需要什么?

本指南假设你已经有过安装和测试mod_perl的经验。以及较新版本的Apache的安装经验。因为有可能你需要在你的机器上实现时适当的修改本文提供的配置。我们需要你安装一些模块并且需要进入Apache的配置目录作修改。所以最好你有root权限来做这些事情。当然你还需要一个文本编辑器。

切入正题

mod_perl模块也是Perl模块,但它有较为特别的设计。最方便的创建一个Perl模块的方法就是使用标准的Perl分发自带的工具h2xs。你可以在命令行模式键入h2xs来看看它的参数列表。现在,到一个适当的目录开始一个新项目,键入:h2xs-AX-nApache::Tutorial::Firsth2xs将会创建目录Apache,以及其他一些子目录.现在进入最深一级的目录看看:cdApache/Tutorial/First在这个新目录里面,你可以看到6个文件:README,Changes,First.pm,MANIFEST,Makefile.PL和Apache-Tutorial-First.t。它们的作用如下:

README

这个文件包含一些安装信息,模块依赖性,版权信息等

Changes

这个文件作为你的项目的修改日志(changelog)文件

First.pm

这是主模块文件,包含你的mod_perl句柄代码(handlercode)。

MANIFEST

本文件用于自动构建tar.gz类型的模块版本分发。这样你就可以把你的模块拿到CPAN发布或者分发给其他人。它包含了你在这个项目中所有文件的列表。

Makefile.PL

这是标准的PerlMakefile构造器。用于创建Makefile.PL文件来编译该模块。

Apache-Tutorial-First.t

针对该模块的一些测试脚本。默认情况下它只是检查模块的载入,你可以添加一些新的测试单元。好了,现在我们开始把First.pm变为可工作的mod_perl模块。使用文本编辑器打开该文件,修改后的内容如下:

packageApache::Tutorial::First;

usestrict;

usevarsqw/$VERSION/;

useApache::Constants;

$VERSION=0.01;

subhandler{

my$r=shift;

$r->send_http_header('text/html');

print

"

HelloWorld";

returnOK;

}

1;

不要忘记文件末尾的”1;”,对于Perl来说,一个模块最后返回的非零值表示该模块已经被成功编译。

安装你的模块

h2xs工具使我们的模块安装工作极为方便。在和你的First.pm文件相同的目录中。键入:

perlMakefile.PL

make

maketest如果maketest成功的话,你需要以root身份执行:

makeinstall这样你就把你的模块安装到了perl的库目录(librarydirectory)。

添加该模块为Apache的一个句柄(handler)

现在我们需要进入Apache配置目录来修改配置文件,使我们的模块作为Apache内容处理阶段的处理器。打开httpd.conf文件,在末尾加入如下配置:

SetHandlerperl-script

PerlHandlerApache::Tutorial::First

然后保存配置文件,并且重新启动apache服务器:

apachectlstop

apachectlstart现在使用浏览器访问http://localhost/mod_perl_tutorial,你将如期的看到显示“HelloWorld”页面。

当Apache启动的时候,它读取它的配置指令并把适当的命令传递给相应的处理该命令的模块。这里有两个相关的指令SetHandler和PerlHandler。

第一个指令SetHandler由mod_mime模块处理,该指令表示使用什么模块作为处理请求的主要部分。这里所设置的perl-script表示使用mod_perl来处理请求。

第二个指令PerlHandler由mod_perl模块来处理,它只是简单的说明使用我们的模块来处理请求的主要部分。有一点需要注意,无论何时在你有一个PerlHandler时,你需要相应的SetHandlerperl-script配置指令。这样才能使你的mod_perl代码起作用。我总是认为这是一个弱点,但这将涉及Apache内部的处理机制,所以在将来这也很难改变。

现在请求来了,Apache查看用什么模块来处理相应的URI并且在这里决定使用mod_perl,而mod_perl知道它必须把请求发送给我们的模块,并调用我们模块的handler()函数作为Apache::Request对象的第一个参数。而我们的handler()函数的返回值决定了下一步Apache将要做什么。现在我们知道返回值OK意味着一切成功。OK是个从Apache::Constants模块导出的常量。

调试

如果你没有看到“HelloWorld”,那你可能看到了一个错误页面,或者其他什么完全不同的。第一步去查看错误日志看看到底是什么发生了错误。我习惯于在浏览器中请求后立即查看错误日志。你可以使用tail工具:tail-f/path/to/apache/logs/error_log(使用你的真实error_log路径替换上面的路径。如果你不肯定它在哪里,查看你的httpd.conf文件的ErrorLog指令部分)

现在重新载入页面,然后error_log将告诉你什么地方出现了问题。更多的关于perl调试,请参见perldebug.

加入更多

现在如果你想要针对上面的情况作一些修改,该如何做呢?不幸的,唯一一种安装模式如下:

修改你的First.pm文件

重新以root身份运行makeinstall

重新启动Apache

这也许很麻烦,特别是重新启动Apache。针对这个问题,我们可以另外安装一个特别设计的模块来避免每次这样麻烦的做。首先你需要从CPAN下载并安装Apache::Reload模块(除非你已经使用mod_perl1.26或者更高版本)。在这里http://search.cpan.org/search?dist=Apache-Reload下载。

解开tar.gz文件并进入新目录,执行:

perlMakefile.PL

make然后到root身份执行:

makeinstall现在再次打开httpd.conf文件,加入:

PerlInitHandlerApache::Reload这将测试所有有所改变的模块并在必要时自动重新载入新模块。这对于开发来说很有用,但会有性能损失,所以在开发完成之后,就将该特性关闭。

阅读更多

从这里开始你有很多事情需要去做。ApacheAPI本身就十分庞大,大多数都可以通过perldocApache看到相应的文档.现在这个模块基本上没有什么价值,因为只有一个URI可以用于被该模块所控制(http://server/mod_perl_tutorial),这使得它变得不够灵活。为了使一个模块可以处理多个URI,有许多解决办法,但最好的还是推荐使用Apache::Dispatch模块。

可以在CPAN下载http://search.cpan.org/search?dist=Apache-Dispatch.Apache::Dispatch允许你保留标准的mod_perlhandler构架,同时还允许多个函数和多个URIs被派发。

接下来我不建议象例子中一样直接向浏览器输出内容。请考虑使用一些常用的模版技术,比如Template-Toolkit,HTML::Template,更甚于使用XSLT或者XPathScript(有很多很多这样的模版技术可选,我们希望有一天可以有文章来讨论这些技术来帮助你来选择)。

延伸 · 阅读

精彩推荐
  • perlPerl的经典用法分享

    Perl的经典用法分享

    Perl的经典用法分享,学习perl的朋友可以参考下 ...

    脚本之家6562020-06-06
  • perlPerl List::Util模块使用实例

    Perl List::Util模块使用实例

    这篇文章主要介绍了Perl List::Util模块使用实例,本文给出扫描符合条件的某个列表并取出第一个符合条件的、求1到1000之间的和 、求一组数字的最大值与最小...

    脚本之家4712020-06-22
  • perlperl use vars pragma使用技巧

    perl use vars pragma使用技巧

    perl 中的vars是perl中的一个pragma(预编译指示符),专门用来预定义全局变量,这些预定义后的全局变量在qw()列表中,在整个引用perl文件中皆可使用,即便使...

    perl教程网6812020-06-16
  • perlperl常见问题集合之二

    perl常见问题集合之二

    哪些平台上有 Perl?要到哪里去找? Perl的标准发行版(由 perl 发展小组负责维护)仅以原始码形式发行。您可在 http: //www.perl.com/CPAN/src/latest.tar.gz处取得。这个档...

    脚本之家2102020-05-29
  • perlperl pop push shift unshift实例介绍

    perl pop push shift unshift实例介绍

    perl的pop跟push操作数组的最右边,shift跟unshift操作数组的最左边 ...

    脚本之家4612020-06-10
  • perlPerl使用nginx FastCGI环境做WEB开发实例

    Perl使用nginx FastCGI环境做WEB开发实例

    这篇文章主要介绍了Perl使用nginx FastCGI环境做WEB开发实例,实现了路由系统和模板系统,需要的朋友可以参考下...

    Perl教程网2412020-06-18
  • perlperl命令行参数内建数组@ARGV浅析

    perl命令行参数内建数组@ARGV浅析

    这篇文章主要介绍了perl命令行参数内建数组@ARGV浅析,本文重点在于讲解@ARGV的用法,并通过实例来说明,需要的朋友可以参考下 ...

    perl教程网6162020-06-18
  • perlPerl从文件中读取字符串的两种实现方法

    Perl从文件中读取字符串的两种实现方法

    有时候我们需要从文件中读取字符串,这里简单介绍下, 需要的朋友可以参考下 ...

    脚本之家6252020-06-08