Laravel 4 and NodeJs/Redis pub/sub realtime notifications

Currently I am building an application where we can fill in live scores and I needed something to update all my visitors whenever a score has been updated by one of the admins.

Whenever an admin updates the score via the Laravel 4 backend I fire an event and publish it to Redis. I’ve setup a simple NodeJS server which listens to Redis for incoming changes. NodeJS will redirect the message to all Socket.IO clients.

Laravel

1. Open config//database.php
2. Configure:

'redis' => array(

		'cluster' => false, //publish won't work when set to true

		'default' => array(
			'host'     => '127.0.0.1',
			'port'     => 6379,
			'database' => 0,
		),

	),

3. Create app\events folder and update composer.json

"autoload": {
	"classmap": [
	    ....
            "app/events",

4. Create UpdateScoreEventHandler.php in the events folder:

class UpdateScoreEventHandler {

    CONST EVENT = 'score.update';
    CONST CHANNEL = 'score.update';

    public function handle($data)
    {
        $redis = Redis::connection();
        $redis->publish(self::CHANNEL, $data);
    }
}

5.Create listeners.php (next to routes.php/filters.php):

Event::listen(UpdateScoreEventHandler::EVENT, 'UpdateScoreEventHandler');

6. Add to start/global.php:

require app_path().'/listeners.php';

7. Fire event in controller (update score) :

Event::fire(UpdateScoreEventHandler::EVENT, array($updatedMatch));

8. Run composer update (class loading)

NodeJS

1. Download NodeJS via the website (http://nodejs.org/)
2. Create a nodejs folder in Laravel’s root.
3. /nodejs/npm install socket.io express redis
4. Create nodejs server (e.g. server.js) and store it /nodejs

var express =   require('express'),
    http =      require('http'),
    server =    http.createServer(app);

var app = express();

const redis =   require('redis');
const io =      require('socket.io');
const client =  redis.createClient();

server.listen(3000, 'localhost');

io.listen(server).on('connection', function(client) {
    const redisClient = redis.createClient()
    redisClient.subscribe('score.update');

    redisClient.on("message", function(channel, message) {
        //Channel is e.g 'score.update'
        client.emit(channel, message);
    });

    client.on('disconnect', function() {
        redisClient.quit();
    });
});

Client

1. Include Socket.io client in your page (https://github.com/LearnBoost/socket.io/releases)
2. Add code below to receive messages when a score has been updated.

<script type="text/javascript">// <![CDATA[
            var socket = io.connect('http://127.0.0.1:3000/');

            //socket.on('connect', function(data){
            //    socket.emit('subscribe', {channel:'score.update'});
            //});

            socket.on('score.update', function (data) {
                //Do something with data
                console.log('Score updated: ', data);
            });

// ]]></script>

5. Start the server

/nodejs/node server.js

Redis

1. Download Redis (http://redis.io/download)
2. Go to extacted folder
3. Go to src folder
4. Start the server

./redis-server

Optional – Monitor Redis (requests)

1. ./redis-cli monitor

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>