Perl#

该模块用于在Perl中实现位置和变量处理程序,并将Perl调用插入到SSI中。

当从源代码 构建 时,默认情况下不会构建此模块;应通过 配置选项 启用 ‑‑with‑http_perl_module

在我们的存储库中,该模块是 动态构建的,并作为一个名为 angie-module-perlangie-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 模块 :: 函数 | 'sub { ... }';

默认值

上下文

location, limit_except

为给定位置设置Perl处理程序。

perl_modules#

语法

perl_modules 路径;

默认值

上下文

http

设置Perl模块的附加路径。

perl_require#

语法

perl_require 模块;

默认值

上下文

http

定义将在每次重新配置时加载的模块名称。可以存在多个 perl_require 指令。

perl_set#

语法

perl_set $variable module :: function | 'sub { ... }';

默认值

上下文

http

为指定变量安装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 ])#

返回或设置指定变量的值。变量对每个请求都是本地的。