perl - 如何正确关闭 Mojolicious::Lite 服务器?

标签 perl mojolicious

在 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/

相关文章:

perl - 在没有Mojolicious::Lite的情况下使用 "under"进行Mojolicious基本身份验证

perl - 使用 Perl 抓取 HTML 文件,仅返回内容,按顺序

Perl - 这是looks_like_number 的错误,还是我是个愚蠢的人?

perl - 如何在 Perl 中 tar 多个文件?

perl - 我如何知道机器上的特定 Perl 安装最初提供了哪些模块?

perl - Mojolicious 应用程序中的并行请求

perl - "ladder sub {...}"在 perl 中是什么意思?

perl cgi - 更改临时上传文件的位置

Perl 文件通配的奇怪现象

html - Mojolicious 响应的基本 URL