Perl 如何在Win32::Daemon下运行mojolicious?
我正在尝试使用Win32::Daemon将mojolicious作为Windows服务运行,但我不知道启动mojo应用程序后如何从开始回调返回。mojo应用程序开始侦听,但Windows服务控制器假定启动失败,因为您从未到达return语句Perl 如何在Win32::Daemon下运行mojolicious?,perl,mojolicious,Perl,Mojolicious,我正在尝试使用Win32::Daemon将mojolicious作为Windows服务运行,但我不知道启动mojo应用程序后如何从开始回调返回。mojo应用程序开始侦听,但Windows服务控制器假定启动失败,因为您从未到达return语句 sub Callback_Start { my( $Event, $Context ) = @_; app->start; # <-- code hangs here $Context->{last_state}
sub Callback_Start
{
my( $Event, $Context ) = @_;
app->start; # <-- code hangs here
$Context->{last_state} = SERVICE_RUNNING;
Win32::Daemon::State( SERVICE_RUNNING );
return();
}
子回调\u启动
{
我的($Event$Context)=@;
app->start;#{last_state}=SERVICE_RUNNING;
Win32::Daemon::State(正在运行的服务);
return();
}
是否可以以非阻塞方式启动Mojo服务器?如果要启动进程,请在子进程中运行web应用程序,并在父进程中让服务控制器知道一切正常运行。我对你在这种情况下如何停止服务很好奇:)这就是我最后做的:
my $daemon = Mojo::Server::Daemon->new( app => app, listen => ['http://*:3000' ] );
$daemon->prepare_ioloop;
Win32::Daemon::StartService( \%context, 100 );
Win32::Daemon::RegisterCallbacks({
start => \&_start,
running => \&_running,
stop => \&_stop,
pause => \&_pause,
continue => \&_continue,
});
# ...
sub _running {
my( $Event, $context ) = @_;
if( SERVICE_RUNNING == Win32::Daemon::State() ) {
$daemon->ioloop->one_tick;
}
}
sub _start {
my ($event, $context ) = @_;
$context->{last_state} = SERVICE_RUNNING;
$context->{last_event} = $event;
Win32::Daemon::State( SERVICE_RUNNING );
return();
}
# ...
重复调用one_tick方法可以嵌入Mojo服务器(请参阅)。使用上面的代码,Windows将每隔100毫秒调用运行的\usub(秒StartService参数) 您将如何手动启动它(不是作为服务)?我猜这无法启动运行您的应用程序的Web服务器。检查后,Web服务器将启动。此外,当我将其作为服务启动时,您可以通过web浏览器访问webapp。问题是服务控制器认为服务没有完成启动过程请注意,web上下文中的“非阻塞”通常意味着其他内容:serever以非阻塞/异步方式处理连接