我有一个〜15岁的Perl-Application.该应用程序在Apache上运行,示例代码如下所示:
use Apache2::RequestUtil (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; Apache2::RequestUtil->request($r) $r->subprocess_env; $r = Apache2::RequestUtil->request; $r->content_type("text/html"); $r->print("Hello World"); }; return Apache2::Const::OK; } 1;
这有效,但现在我想使用Mojolicious来实现这个应用程序的新功能.但是如何将Mojolicious整合到这个应用程序中呢?当我做以下
use Apache2::RequestUtil (); use Apache2::RequestRec (); use Apache2::Const -compile => qw(OK); sub handler { my $r = shift; Apache2::RequestUtil->request($r $r->subprocess_env; $r = Apache2::RequestUtil->request; get '/:foo' => sub { my $self = shift; my $foo = $self->param('foo'); $self->render(text => "Hello from $foo."); }; return Apache2::Const::OK; } app->start; 1;
我得到一个空白页面.是否可以将Mojo集成到我的应用程序中?
如果您想要Mojolicious的好处,则不应直接使用Apache请求.
首先,您需要特殊的虚拟主机配置.请参阅https://github.com/kraih/mojo/wiki/Apache-deployment并向下滚动到Apache/mod_perl(PSGI/Plack)一章.我撰写了这一章,因为我在mod_perl下运行了十几个Mojo应用程序,并且找到一种有效的方法需要一些试验和错误.
这里以Apache配置文件为例:
ServerName myapp.local DocumentRoot /home/sri/myapp PerlOptions +Parent $ENV{PLACK_ENV} = 'production'; $ENV{MOJO_HOME} = '/home/sri/myapp'; $ENV{MOJO_MODE} = 'deployment'; SetHandler perl-script PerlResponseHandler Plack::Handler::Apache2 PerlSetVar psgi_app /home/sri/myapp/script/myapp
其次你的模块MyApp.pm
应如下所示:
package MyApp; use Mojo::Base 'Mojolicious'; sub startup { my $app = shift; my $routes = $app->routes; $routes->get('/:foo' => sub { my $self = shift; my $foo = $self->param('foo'); $self->render(text => "Hello from $foo."); }); } 1;
这就是你所需要的.所述Plack::Handler::Apache2
构建之间的层mod_perl
和Mojolicious
.当然你需要一个脚本myapp
.此脚本还允许您从桌面控制台运行Web应用程序,例如在开发和测试期间.