IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Plack 代码和结构分析-plackup Architecture[译]

扶凯 2015-02-26 22:27:55 累计浏览 1,556 次
本机暂存

Plack::Runner 和 plackup

plackup 通过执行 PSGI 的应用来开始 PSGI 的服务. 这个脚本只是非常简单的封闭了 Plack::Runner. 其它的所有都是通过 Plack::Runner 来执行.

  1. 解析命令行的参数.

  2. 选择 Loader 的类并实例化 (通过 Plack::Loader 开头名字空间).

  3. 选择服务器的 lib 库 (通过 Plack::Handler 开头名字空间).

  4. 启动 PSGI 的服务器和传给 PSGI 的应用.

Plack::Loader

Loader 负责实例化和运行 PSGI 服务器. 这个 $loader 对象有一些有意思的功能:

  • $loader->guess() 通过命令行的 $ENV 和 %INC 来猜测使用哪个服务器的 lib 库.

  • $loader->load() 实例化这个服务器的 lib 库, 并返回这个服务器 lib 所产生的对象.

  • $loader->run() 启动这个服务器.

这个 Plack::Loader 的名字空间包含下面三种类型的 loader:

  • Plack::Loader::Delayed - 延迟编译 web app , 直到第一个请求到达

  • Plack::Loader::Restarter - 如果文件发现了任何改变, 会重起这个服务器

  • Plack::Loader::Shotgun - 为每个请求都实时 fork 一个编译的 web app 来运行

我们可以通过 plack -loader 来改变 loader.

Plack::Handler

PSGI spec 中告诉我们 PSGI 定义了应用和服务器之间的接口. 因为 PSGI 的 spec 非常的短小, 这个协议很好的解释了应用程序和 Web 服务器是怎么样通信和工作的.

A library in the Plack::Handler 名字空间的 lib 中包含了满足实际应用服务器. This layer contains all the wiggling.

让我们来写一个新的服务器 AngryBrontosaurus, 我想通过 plackup -server AngryBrontosaurus 来执行. 我实现了一个简单的类, 象下面这样:

packagePlack::Handler::AngryBrontosaurus
usestrict;
useAngryBrontosaurus;
  
subnew {
    my$class= shift;
    bless{ @_}, $class;
}
  
subrun {
    my($self, $app) = @_;
    AngryBrontosaurus->new->run($app, $self);
}

在这, 我们要保证 AngryBrontosaurus 在Plack::Handler::AngryBrontosaurus 当中正确的实现了 PSGI spec, 我们可以通过 Plack::Test::Suite 来测试.

useTest::More;
usePlack::Test::Suite;
Plack::Test::Suite->run_server_tests('AngryBrontosaurus');
done_testing;

注意在这, Plack::Handler 名字空间包含了几个 PSGI 服务器的类, 象 Plack::Handler::Starman 和 Plack::Handler::Twiggy, 其中也包含一些类象Plack::Handler::Apache2 和 Plack::Handler::FCGI. 很明显 Apache2 是不可能兼容 PSGI , 但通过这个 Plack::Handler::Apache2 层处理后就能兼容 PSGI 的应用.

时序图

有关 Plack::Runner, Plack::Handler, 和 Plack::Loader 相互作用的时序图.


来源: <http://blog.kablamo.org/2014/04/09/read-plack-2/>

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. perl更新/修改/删除文本文件内容 (累计阅读 10,648)
  2. perl大牛flw传说 (累计阅读 7,715)
  3. AWStats是一个基于Perl的WEB日志分析工具。 (累计阅读 7,176)
  4. perl模块Getopt::Std用法及实例-从命令行读取参数模块 (累计阅读 7,018)
  5. [Perl] Template::Toolkit 模板技术. (累计阅读 6,347)
  6. Perl命令行常见用法及技巧 (累计阅读 5,912)
  7. PHP将死,何以为继? (累计阅读 5,919)
  8. 在perl中连接和使用sqlite做数据存储 (累计阅读 5,814)
  9. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (累计阅读 5,609)
  10. perl的expect使用方法,实现非交互式登录。 (累计阅读 5,488)