Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/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 Redis listen不订阅通道_Perl_Redis_Mojolicious - Fatal编程技术网

Perl Redis listen不订阅通道

Perl Redis listen不订阅通道,perl,redis,mojolicious,Perl,Redis,Mojolicious,这段代码似乎不起作用,我不知道如何调试。。我正在使用Mojolicious通过websocket发送订阅的消息 use Mojo::Redis; #Controller sub data_stream { my $c = shift; $c->inactivity_timeout(300); my $redis = Mojo::Redis-new('redis://xxxxxxxx@localhost:6379/'); my $pubsub = $redi

这段代码似乎不起作用,我不知道如何调试。。我正在使用Mojolicious通过websocket发送订阅的消息

use Mojo::Redis;
#Controller
sub data_stream {
    my $c = shift;
    $c->inactivity_timeout(300);

    my $redis = Mojo::Redis-new('redis://xxxxxxxx@localhost:6379/');
    my $pubsub = $redis->pubsub;

    my $cb = $pubsub->listen('data' => sub  {
        my ($pubsub, $msg) = @_;
        $c->app->log->debug("WS: $msg");
        $c->send({text => $msg});
    });

    $c->on(finish => sub {
        $c->app->log->debug("WS CONNECTION CLOSED!");
        $pubsub->unlisten('data' => $cb)
    });
}
从下面的路由器调用上面的Sub

$router->websocket('/data_stream')->to('grid#data_stream');

哈哈,这是我自己回答的第二个问题。 当我将Mojo::Redis新位作为助手移动时,这一点终于起作用了

所以在路由器文件中

$self->helper(redis => sub {
        state $redis = Mojo::Redis->new('redis://anything:jejakredis1234!@localhost:6379/');
    });
和在控制器中

sub data_stream {
    my $c = shift;
    $c->inactivity_timeout(300);

    my $pubsub = $c->redis->pubsub;

    my $cb = $pubsub->listen('data' => sub  {
        my ($pubsub, $msg) = @_;
        $c->app->log->debug("WS: $msg");
        $c->send({text => $msg});
    });

    $c->on(finish => sub {
        $c->app->log->debug("WS CONNECTION CLOSED!");
        $pubsub->unlisten('data' => $cb)
    });
}

你能包括设置websocket的其余代码(从$c和$c->app的使用中,我假设它在一个有趣的websocket路径中)并描述什么不起作用吗?@Grinnz谢谢。我已经编辑了我的帖子。代码基于模块示例,但URI部分的密码除外。为了验证它是否正常工作,我有另一个使用Redis模块的脚本。每次我直接从redis Clip发布时,这个脚本都会工作。问题可能是您的Mojo::redis对象在该操作结束时超出范围,从而关闭连接。通过在助手中将其声明为状态变量,它将在该过程的其余部分保持不变。@grinz谢谢!是的,我也注意到了。但是它是如何以及何时超出范围的呢?“my”变量在声明它们的块的末尾超出范围,如果没有其他变量对它们进行强引用的话。我明白了。。我想当它到达“listen”时,引用会停留在该块中