Как правильно закрыть сервер Mojolicious::Lite?

В приложении 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, но это недоступно.

Есть ли правильный метод, который я должен использовать для доступа к серверу?

Ники


person Nicky    schedule 04.04.2014    source источник


Ответы (1)


Обновление 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 для префорка


Оригинал:

Конечно, есть несколько способов сделать это.

Вероятно, лучше всего просто прикрепить к транзакции обработчик завершения:

#!/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 таймера, который будет ждать несколько секунд и выход.

#!/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;
person Joel Berger    schedule 06.04.2014