取势 明道 优术

作者为 扶 凯 发表

这是我的译文,原文:

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个评论