在 Mojolicious::Lite 应用程序中,我有一个路由,我想终止服务器并重定向到另一个站点。这是片段。
my $me = $$;
get '/kill' => sub {
my $self = shift;
$self->res->code(301);
$self->redirect_to('http://www.google.com');
$self->app->log->debug("Goodbye, $name.");
# I need this function to return so I delay the kill a little.
system("(sleep 1; kill $me)&");
};
这段代码做了我想要的,但感觉不对。我试过 $self->app->stop 但这不可用。
我应该使用适当的技术来访问服务器吗?
尼基
最佳答案
2021 年更新:
最近在 IRC 讨论中提到了这个答案,因此有必要进行更新。下面的回复是我在一个非常具体的案例中使用的机制。虽然在极少数情况下它可能仍然有用,但停止服务的更正确方式是
https://docs.mojolicious.org/Mojo/IOLoop#stop_gracefully
或 https://docs.mojolicious.org/Mojo/Server/Daemon#SIGNALS对于单进程服务器或 https://docs.mojolicious.org/Mojo/Server/Prefork#MANAGER-SIGNALS用于预 fork
原来的:
当然,有几种方法可以做到这一点。
可能最好的方法是简单地将完成处理程序附加到事务:
#!/usr/bin/env perl
use Mojolicious::Lite;
get '/kill' => sub {
my $c = shift;
$c->redirect_to('http://google.com');
$c->tx->on( finish => sub { exit } );
};
app->start;
最像你的例子的方法是设置一个 Mojo::IOLoop
timer这将等待几秒钟并退出。#!/usr/bin/env perl
use Mojolicious::Lite;
use Mojo::IOLoop;
get '/kill' => sub {
my $c = shift;
$c->redirect_to('http://google.com');
my $loop = Mojo::IOLoop->singleton;
$loop->timer( 1 => sub { exit } );
$loop->start unless $loop->is_running; # portability
};
app->start;
关于perl - 如何正确关闭 Mojolicious::Lite 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22871601/