Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在Win32::Daemon下运行mojolicious?_Perl_Mojolicious - Fatal编程技术网

Perl 如何在Win32::Daemon下运行mojolicious?

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}

我正在尝试使用Win32::Daemon将mojolicious作为Windows服务运行,但我不知道启动mojo应用程序后如何从开始回调返回。mojo应用程序开始侦听,但Windows服务控制器假定启动失败,因为您从未到达return语句

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以非阻塞/异步方式处理连接