Laravel 5.1如何与Redis配合使用

3
这是我的Routes.php文件。
Route::get('hello1',function(){
    Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});

这是我的app.js文件

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();


app.get('/', function(req, res){
    res.sendFile(__dirname + '/index.html');
});


redis.subscribe('test-channel', function () {
    console.log('Redis: test-channel subscribed');
});

redis.on('message', function(channel, message) {
    console.log('Redis: Message on ' + channel + ' received!');
    console.log(message);
    message = JSON.parse(message);
    io.emit(channel, message.payload)
});

io.on('connection', function(socket){
    console.log('a user connected');
    socket.on('disconnect', function(){
        console.log('user disconnected');
    });
});


http.listen(6379, function(){
    console.log('listening on *:6379');
});

my index.html

<!doctype html>
<html>
<head>
    <title>Socket.IO</title>
</head>
<body>
<ul id="messages">
    <li>Hardcoded Message</li>
</ul>

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
    var socket = io();
    socket.on("test-channel", function(message) {
        console.log(message);
        $('#messages').append($('<li>').text(message));
    });
</script>
</body>
</html>

现在无论是运行 php artisan redis:subscribe 还是 hello1 路由,我都会遇到如下错误:

AbstractConnection.php 文件的第 146 行 ConnectionException 错误:从服务器读取行时出错。[tcp://localhost:6379]

1个回答

2
默认情况下,Redis监听端口为6379,而您将http服务器设置为监听同一端口。这样是行不通的,运行node应用程序时是否出现错误?如果没有错误,则Redis很可能根本没有运行或在另一个端口上进行监听。
如果您的Redis实例在其他端口上进行了监听,laravel将尝试连接到端口6379上的Redis,并命中节点服务器,因此无法连接到Redis,因为此端口上没有Redis,而是一个监听此端口的节点HTTP服务器。
如果您的Redis实例在另一个端口上进行监听,并且已经在laravel配置中更改了此端口,则需要通过传递端口来更改连接ioredis到Redis的方式:
例如:
var redis = new Redis(6380) 

请参阅github页面,了解有关将ioredis连接到redis的进一步详细信息。
总之,请确保:
  1. Redis正在运行
  2. 您的HTTP服务器正在侦听与Redis不同的端口
  3. 您在config/database.php和config/broadcast.php(Laravel)中为Redis以及在server.js文件中为节点设置的连接设置是正确的
请注意,连接到redis的不是HTTP服务器,而是ioredis。

感谢Michael先生。 通过dos模式安装redis服务器并启动一切都很好。但是每当我尝试通过node js启动redis服务器时,我总是会收到错误消息:events.js:85 throw er; // Unhandled 'error' event ^ Error: Redis connection to 127.0.0.1:6379 failed - read ECONNRESET at RedisClient.on_error 我不明白为什么。 - ujwal dhakal
1
不客气!在开始从node建立连接之前,需要运行Redis。使用您所拥有的代码,Node无法启动它。在此处有一个关于正确设置redis的好解释。 - baao
但是我担心如何在真实的服务器上执行这些操作,因为对于我来说很容易,因为我在Windows上进入CLI模式并打开Redis服务器端口 :) 无论如何,谢谢你Michael,你节省了我很多时间,向您致以1000个感谢。 - ujwal dhakal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接