Perl#
该模块用于在Perl中实现位置和变量处理程序,并将Perl调用插入到SSI中。
当从源代码 构建 时,默认情况下不会构建此模块;应通过 配置选项 启用 ‑‑with‑http_perl_module
。
在我们的存储库中,该模块是 动态构建的,并作为一个名为 angie-module-perl
或 angie-pro-module-perl
的独立包提供。
重要
此模块需要Perl版本5.6.1或更高版本。C编译器应与用于构建Perl的编译器兼容。
已知问题#
该模块是实验性的,购买者需自担风险。
为了让Perl在重新配置期间重新编译修改过的模块,它应该使用参数 -Dusemultiplicity=yes
或 -Dusethreads=yes
构建。此外,为了减少Perl在运行时的内存泄漏,它应该使用参数 -Dusemymalloc=no
构建。要检查已经构建的Perl中这些参数的值(示例中指定了首选值),可以运行:
$ perl -V:usemultiplicity -V:usemymalloc | br |
usemultiplicity='define'; | br |
usemymalloc='n';
注意,在使用新的 -Dusemultiplicity=yes
或 -Dusethreads=yes
参数重新构建Perl后,所有二进制Perl模块也都必须重新构建——它们将无法与新的Perl一起工作。
在每次重新配置后,主进程和工作进程可能会变大。如果主进程增长到不可接受的大小,可以在不更改可执行文件的情况下应用 实时升级 过程。
当Perl模块执行长时间运行的操作时,例如解析域名、连接到另一个服务器或查询数据库,分配给当前工作进程的其他请求将不会被处理。因此,建议仅执行具有可预测且较短执行时间的操作,例如访问本地文件系统。
配置示例#
http {
perl_modules perl/lib;
perl_require hello.pm;
perl_set $msie6 '
sub {
my $r = shift;
my $ua = $r->header_in("User-Agent");
return "" if $ua =~ /Opera/;
return "1" if $ua =~ / MSIE [6-9]\.\d+/;
return "";
}
';
server {
location / {
perl hello::handler;
}
}
perl/lib/hello.pm 模块:
package hello;
use nginx;
sub handler {
my $r = shift;
$r->send_http_header("text/html");
return OK if $r->header_only;
$r->print("hello!\n<br/>");
if (-f $r->filename or -d _) {
$r->print($r->uri, " exists!\n");
}
return OK;
}
1;
__END__
指令#
perl#
为给定位置设置Perl处理程序。
perl_modules#
设置Perl模块的附加路径。
perl_require#
定义将在每次重新配置时加载的模块名称。可以存在多个 perl_require 指令。
perl_set#
为指定变量安装Perl处理程序。
从SSI调用Perl#
调用Perl的SSI命令格式如下:
<!--# perl sub="module::function" arg="parameter1" arg="parameter2" ...
-->
$r请求对象方法#
$r->args
#
返回请求参数。
$r->filename
#
返回与请求URI对应的文件名。
$r->has_request_body
(handler)#
如果请求中没有主体,则返回0。如果有主体,为请求设置指定的处理程序并返回1。在读取请求主体后,Angie将调用指定的处理程序。注意,处理程序函数应通过引用传递。示例:
package hello;
use nginx;
sub handler {
my $r = shift;
if ($r->request_method ne "POST") {
return DECLINED;
}
if ($r->has_request_body(\&post)) {
return OK;
}
return HTTP_BAD_REQUEST;
}
sub post {
my $r = shift;
$r->send_http_header;
$r->print("request_body: \"", $r->request_body, "\"<br/>");
$r->print("request_body_file: \"", $r->request_body_file, "\"<br/>\n");
return OK;
}
1;
__END__
$r->allow_ranges
#
在发送响应时启用字节范围的使用。
$r->discard_request_body
#
指示Angie丢弃请求主体。
$r->header_in
(field)#
返回指定客户端请求头字段的值。
$r->header_only
#
确定是发送整个响应还是仅发送其头部给客户端。
$r->header_out
(field, value)#
为指定的响应头字段设置值。
$r->internal_redirect
(uri)#
执行到指定URI的内部重定向。实际重定向在Perl处理程序执行完成后进行。方法接受转义的URIs,并支持重定向到 命名位置。
$r->log_error
(errno, message)#
将指定的消息写入 error_log。如果 errno 非零,则会将错误代码及其描述附加到消息中。
$r->print
(text, ...)#
将数据传递给客户端。
$r->request_body
#
如果未将客户端请求主体写入临时文件,则返回客户端请求主体。要确保客户端请求主体在内存中,其大小应受限于 client_max_body_size,并且应使用 client_body_buffer_size 设置足够的缓冲区大小。
$r->request_body_file
#
返回包含客户端请求主体的文件名。处理完成后,应删除该文件。要始终将请求主体写入文件,应启用 client_body_in_file_only。
$r->request_method
#
返回客户端请求的HTTP方法。
$r->remote_addr
#
返回客户端IP地址。
$r->flush
#
立即将数据发送给客户端。
$r->sendfile
(name [, offset [, length ]])#
将指定文件内容发送给客户端。可选参数指定要传输的数据的初始偏移量和长度。实际数据传输在Perl处理程序完成后进行。
$r->send_http_header
([type])#
将响应头发送给客户端。可选的类型参数设置“Content-Type”响应头字段的值。如果值为空字符串,“Content-Type”头字段将不会发送。
$r->status
(code)#
设置响应代码。
$r->sleep
(milliseconds, handler)#
设置指定的处理程序并停止请求处理指定的时间。同时,Angie继续处理其他请求。在指定时间过去后,Angie将调用安装的处理程序。注意,处理程序函数应通过引用传递。为了在处理程序之间传递数据,应使用 $r‑>variable()。示例:
package hello;
use nginx;
sub handler {
my $r = shift;
$r->discard_request_body;
$r->variable("var", "OK");
$r->sleep(1000, \&next);
return OK;
}
sub next {
my $r = shift;
$r->send_http_header;
$r->print($r->variable("var"));
return OK;
}
1;
__END__
$r->unescape
(text)#
解码以“%XX”形式编码的文本。
$r->uri
#
返回请求URI。
$r->variable
(name [, value ])#
返回或设置指定变量的值。变量对每个请求都是本地的。