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

使用 plackup 重新加载应用

扶凯 2011-06-24 12:25:48 累计浏览 1,928 次
本机暂存

这是我的译文,原文:

http://advent.plackperl.org/2009/12/day-4-reloading-applications.html

上次文章我到了一些 plackup 命令行的基本功能,今天会学习更多

自动重新加载应用
在开发的过程中,我们常常会修改我的 Perl 代码。然后存成 .psgi 和 .pm 文件。因为 Plack 的服务通过 plackup 的命令来运行,所以你的 Perl 代码(PSGI 的应用)需要编译和运行多次。所以你需要常常重起你的服务,这是相当的痛苦的一件事情。
所以这有一个选项可以监控你的工作目录内的文件修改,检查到有必要时,会然后自动 reload 你的应用-r (or -reload).

$ plackup -r hello.psg

默认这只会监控你的当前目录的代码文件的修改,如果你想修改这个默认的值,可以使用 -R 的选项。

$ plackup -R lib,/path/to/scripts hello.psgi

正如你所见的,这是能同时支持监控多个路径的,默认的是不断的扫描整个目录,如果你是使用的 Linux 支持 Linux::Inotify2 和是使用的 Mac 支持 Mac::FSEvents 。你可以使用文件系统本身的通知,这是更加的高效的。

-r vs 服务器自动发现
我们知道,plackup 会自动的选择帮你加载 Web 服务器,所以如果你的 PSGI 的应用使用了一些事件的模块,象 AnyEvent, POE or Coro 之类,你的后端的服务器就会被修改成使用这个。但有时自动的选择不能正常工作,是错误的。这时我们要自己手工的选择使用 -r 的选项。然后 plackup 会使用延迟加载技术来重新加载你指定的应用重起你的应用派生程序来处理。所以推荐你自己使用 -r 设置服务器和 -s 的选项一起使用。

加载出错?shotgun 和预加载模块
重新加载模块和应用在一些长时间跑的 Perl 应用中容易生产问题,象模块的变量重新定义或被覆盖,然后会产生卡住之类不正常的状态。
Plack 现在有一个 Shotgun 的 loader 方法。这个的灵感也是来自 Rack 中的 shotgun。解决了加载应用程序的请求要求应用程序的重载问题。
使用 Shotgun loader 的方便非常容易

$ plackup -L Shotgun myapp.psgi

这将延迟加载直到运行时应用程序的编译时,当一个新的请求来时, 会 fork 一个新的子进程来编译你的应用然后通过管道返回 PSGI 的响应。您还可以预载一些模块,以减少编译您的应用程序的时间。
例如,你的应用程序需要使用 Moose 和 DBIx::Class ,你能使用这个命令:

$ plackup -MMoose -MDBIx::Class -L Shotgun myapp.psgi

这可以减少你的程序,在运行时需要请求模块文件然后在编译的时间。

同分类推荐文章

  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,714)
  3. AWStats是一个基于Perl的WEB日志分析工具。 (累计阅读 7,175)
  4. perl模块Getopt::Std用法及实例-从命令行读取参数模块 (累计阅读 7,018)
  5. [Perl] Template::Toolkit 模板技术. (累计阅读 6,345)
  6. Perl命令行常见用法及技巧 (累计阅读 5,912)
  7. PHP将死,何以为继? (累计阅读 5,919)
  8. 在perl中连接和使用sqlite做数据存储 (累计阅读 5,813)
  9. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (累计阅读 5,609)
  10. perl的expect使用方法,实现非交互式登录。 (累计阅读 5,486)