wordpress realtime - wordcamp são paulo 2015

81
real time

Upload: fernando-daciuk

Post on 18-Jan-2017

2.906 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: WordPress Realtime - WordCamp São Paulo 2015

real time

Page 2: WordPress Realtime - WordCamp São Paulo 2015

Fernando DaciukFullStack Engineer

npm install fdaciuk

Page 3: WordPress Realtime - WordCamp São Paulo 2015

zimp.me

Page 4: WordPress Realtime - WordCamp São Paulo 2015

github.com/wpbrasil/odin

Page 5: WordPress Realtime - WordCamp São Paulo 2015

da2k.com.br

Page 6: WordPress Realtime - WordCamp São Paulo 2015

JAVASCRIPTNINJA

eventick.com.br/curso-javascript-ninja

Page 7: WordPress Realtime - WordCamp São Paulo 2015

What isreal time?real time?What is

Page 8: WordPress Realtime - WordCamp São Paulo 2015

Process that automatesupdating data

Page 9: WordPress Realtime - WordCamp São Paulo 2015

Give meexamples!

Page 10: WordPress Realtime - WordCamp São Paulo 2015
Page 11: WordPress Realtime - WordCamp São Paulo 2015
Page 12: WordPress Realtime - WordCamp São Paulo 2015

Data needs to beupdated...

Page 13: WordPress Realtime - WordCamp São Paulo 2015

interaction!without user

interaction!without user

Page 14: WordPress Realtime - WordCamp São Paulo 2015

1. fast

2. self-updating

Page 15: WordPress Realtime - WordCamp São Paulo 2015

How todo that?How todo that?

Page 16: WordPress Realtime - WordCamp São Paulo 2015

pooling

Page 17: WordPress Realtime - WordCamp São Paulo 2015

Are wethere yet?

Page 18: WordPress Realtime - WordCamp São Paulo 2015

function update() {

$.get('/api/product/123')

.done(function(data) {

$('#price').text(data.price);

setTimeout(update, 15000);

});

}

pooling

Page 19: WordPress Realtime - WordCamp São Paulo 2015

function update() {

$.get('/api/product/123')

.done(function(data) {

$('#price').text(data.price);

setTimeout(update, 15000);

});

}

functioncreate update

Page 20: WordPress Realtime - WordCamp São Paulo 2015

function update() {

$.get('/api/product/123')

.done(function(data) {

$('#price').text(data.price);

setTimeout(update, 15000);

});

}make an

ajax request

Page 21: WordPress Realtime - WordCamp São Paulo 2015

function update() {

$.get('/api/product/123')

.done(function(data) {

$('#price').text(data.price);

setTimeout(update, 15000);

});

}update price and

run again after 15s

Page 22: WordPress Realtime - WordCamp São Paulo 2015

1. fast

2. self-updating

Page 23: WordPress Realtime - WordCamp São Paulo 2015

so fast!It is notso fast!It is not

Page 24: WordPress Realtime - WordCamp São Paulo 2015

Client requestsserver

00:00 - GET /api/product/123

Page 25: WordPress Realtime - WordCamp São Paulo 2015

Server respondsto client

00:02 - RESPONSE { price: 100}

Page 26: WordPress Realtime - WordCamp São Paulo 2015

Server changes dataafter 3s

00:05 - { price: 120}

Page 27: WordPress Realtime - WordCamp São Paulo 2015

Client waits 15sbefore request again

00:17 - GET /api/product/123

Page 28: WordPress Realtime - WordCamp São Paulo 2015

What is thebetter way?

What is the

Page 29: WordPress Realtime - WordCamp São Paulo 2015

socketsweb

Page 30: WordPress Realtime - WordCamp São Paulo 2015

the data...Server sends

Page 31: WordPress Realtime - WordCamp São Paulo 2015

like

The information

magic!

appears...

Page 32: WordPress Realtime - WordCamp São Paulo 2015

Are youready?Are youready?

Page 33: WordPress Realtime - WordCamp São Paulo 2015

But, how does it work?

That sounds good!

Page 34: WordPress Realtime - WordCamp São Paulo 2015
Page 35: WordPress Realtime - WordCamp São Paulo 2015

CLIENTSIDE

.emit()

Page 36: WordPress Realtime - WordCamp São Paulo 2015

streamtweet

socket.io-playgroundgithub.com/fdaciuk

Page 37: WordPress Realtime - WordCamp São Paulo 2015

npmjs.org/package/node-tweet-stream

Page 38: WordPress Realtime - WordCamp São Paulo 2015

var config = require('./config.json');

var app = require('express')();

var serveStatic = require('serve-static');

var server = require('http').Server(app);

var io = require('socket.io')(server);

var tw = require('node-tweet-stream')(config);

app.js

adddependencies

Page 39: WordPress Realtime - WordCamp São Paulo 2015

var config = require('./config.json');

var app = require('express')();

var serveStatic = require('serve-static');

var server = require('http').Server(app);

var io = require('socket.io')(server);

var tw = require('node-tweet-stream')(config);

app.js

adddependencies

Page 40: WordPress Realtime - WordCamp São Paulo 2015

{

"consumer_key": "CONSUMER_KEY",

"consumer_secret": "CONSUMER_SECRET",

"token": "TOKEN",

"token_secret": "TOKEN_SECRET"

}

config.json

Page 41: WordPress Realtime - WordCamp São Paulo 2015

var config = require('./config.json');

var app = require('express')();

var serveStatic = require('serve-static');

var server = require('http').Server(app);

var io = require('socket.io')(server);

var tw = require('node-tweet-stream')(config);

app.js

adddependencies

Page 42: WordPress Realtime - WordCamp São Paulo 2015

var config = require('./config.json');

var app = require('express')();

var serveStatic = require('serve-static');

var server = require('http').Server(app);

var io = require('socket.io')(server);

var tw = require('node-tweet-stream')(config);

app.js

adddependencies

Page 43: WordPress Realtime - WordCamp São Paulo 2015

app.use(serveStatic(__dirname + '/public'));

app.get('/', function(req, res) {

res.sendFile(__dirname + '/public/index.html');

});

server.listen(3000);

app.js

Createlocal server

Page 44: WordPress Realtime - WordCamp São Paulo 2015

io.on('connection', function(socket) {

console.log('socket.io connected!');

tw.track('wordcampsp');

tw.on('tweet', function(tweet) {

socket.emit('tweet', tweet);

});

});

app.js

socket.ioconfiguration

Page 45: WordPress Realtime - WordCamp São Paulo 2015

io.on('connection', function(socket) {

console.log('socket.io connected!');

tw.track('wordcampsp');

tw.on('tweet', function(tweet) {

socket.emit('tweet', tweet);

});

});

app.js

socket.ioconfiguration

Page 46: WordPress Realtime - WordCamp São Paulo 2015

io.on('connection', function(socket) {

console.log('socket.io connected!');

tw.track('wordcampsp');

tw.on('tweet', function(tweet) {

socket.emit('tweet', tweet);

});

});

app.js

socket.ioconfiguration

Page 47: WordPress Realtime - WordCamp São Paulo 2015

io.on('connection', function(socket) {

console.log('socket.io connected!');

tw.track('wordcampsp');

tw.on('tweet', function(tweet) {

socket.emit('tweet', tweet);

});

});

app.js

socket.ioconfiguration

Page 48: WordPress Realtime - WordCamp São Paulo 2015

io.on('connection', function(socket) {

console.log('socket.io connected!');

tw.track('wordcampsp');

tw.on('tweet', function(tweet) {

socket.emit('tweet', tweet);

});

});

app.js

socket.ioconfiguration

Page 49: WordPress Realtime - WordCamp São Paulo 2015

io.on('connection', function(socket) {

console.log('socket.io connected!');

tw.track('wordcampsp');

tw.on('tweet', function(tweet) {

socket.emit('tweet', tweet);

});

});

app.js

socket.ioconfiguration

Page 50: WordPress Realtime - WordCamp São Paulo 2015

<!DOCTYPE html>

<html>

...

<body>

<ul data-js="tweets"></ul>

<script src="/socket.io/socket.io.js"></script>

<script src="js/main.js"></script>

</body>

</html>

public/index.html

Page 51: WordPress Realtime - WordCamp São Paulo 2015

<!DOCTYPE html>

<html>

...

<body>

<ul data-js="tweets"></ul>

<script src="/socket.io/socket.io.js"></script>

<script src="js/main.js"></script>

</body>

</html>

public/index.html

Page 52: WordPress Realtime - WordCamp São Paulo 2015

<!DOCTYPE html>

<html>

...

<body>

<ul data-js="tweets"></ul>

<script src="/socket.io/socket.io.js"></script>

<script src="js/main.js"></script>

</body>

</html>

public/index.html

Page 53: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

var $tweets = document.querySelector('[data-js="tweets"]');

socket.on('tweet', function(data) {

$tweets.innerHTML += '<li>' + data.text + '<li>';

});

public/js/main.js

Page 54: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

var $tweets = document.querySelector('[data-js="tweets"]');

socket.on('tweet', function(data) {

$tweets.innerHTML += '<li>' + data.text + '<li>';

});

public/js/main.js

Page 55: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

var $tweets = document.querySelector('[data-js="tweets"]');

socket.on('tweet', function(data) {

$tweets.innerHTML += '<li>' + data.text + '<li>';

});

public/js/main.js

Page 56: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

var $tweets = document.querySelector('[data-js="tweets"]');

socket.on('tweet', function(data) {

$tweets.innerHTML += '<li>' + data.text + '<li>';

});

public/js/main.js

Page 57: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

var $tweets = document.querySelector('[data-js="tweets"]');

socket.on('tweet', function(data) {

$tweets.innerHTML += '<li>' + data.text + '<li>';

});

public/js/main.js

Page 58: WordPress Realtime - WordCamp São Paulo 2015

?

Page 59: WordPress Realtime - WordCamp São Paulo 2015

!socket.io-emittersocket.io-redis

Page 60: WordPress Realtime - WordCamp São Paulo 2015

CLIENTSIDE

emit()

+ socket.io-emitter

socket.io-redis

Page 61: WordPress Realtime - WordCamp São Paulo 2015

Installingdependencies

Page 62: WordPress Realtime - WordCamp São Paulo 2015

{

"require": {

"rase/socket.io-emitter": "^0.7.0"

}

}

composer.json

Page 63: WordPress Realtime - WordCamp São Paulo 2015

composer require rase/socket.io-emitter

terminal

Page 64: WordPress Realtime - WordCamp São Paulo 2015

Install “redis-server”on your operating system

Page 65: WordPress Realtime - WordCamp São Paulo 2015

Now, we need a simpleNodeJS Application

Page 66: WordPress Realtime - WordCamp São Paulo 2015

var io = require('socket.io')(3000);

io.adapter(require('socket.io-redis')());

io.on('connection', function() {

console.log('Connected!');

});

app.js

Page 67: WordPress Realtime - WordCamp São Paulo 2015

PHP can’t emit

events to client

Page 68: WordPress Realtime - WordCamp São Paulo 2015

var io = require('socket.io')(3000);

io.adapter(require('socket.io-redis')());

io.on('connection', function() {

console.log('Connected!');

});

app.js

Page 69: WordPress Realtime - WordCamp São Paulo 2015

require_once './vendor/autoload.php';

$id = get_the_ID();

$views = (int) get_post_meta( $id, 'views', true );

$views++;

update_post_meta( $id, 'views', $views );

$emitter = new SocketIO\Emitter();

$emitter->emit( 'post views', $id, $views );

echo $views;

single.php

Page 70: WordPress Realtime - WordCamp São Paulo 2015

require_once './vendor/autoload.php';

$id = get_the_ID();

$views = (int) get_post_meta( $id, 'views', true );

$views++;

update_post_meta( $id, 'views', $views );

$emitter = new SocketIO\Emitter();

$emitter->emit( 'post views', $id, $views );

echo $views;

single.php

Page 71: WordPress Realtime - WordCamp São Paulo 2015

require_once './vendor/autoload.php';

$id = get_the_ID();

$views = (int) get_post_meta( $id, 'views', true );

$views++;

update_post_meta( $id, 'views', $views );

$emitter = new SocketIO\Emitter();

$emitter->emit( 'post views', $id, $views );

echo $views;

single.php

Page 72: WordPress Realtime - WordCamp São Paulo 2015

require_once './vendor/autoload.php';

$id = get_the_ID();

$views = (int) get_post_meta( $id, 'views', true );

$views++;

update_post_meta( $id, 'views', $views );

$emitter = new SocketIO\Emitter();

$emitter->emit( 'post views', $id, $views );

echo $views;

single.php

Page 73: WordPress Realtime - WordCamp São Paulo 2015

require_once './vendor/autoload.php';

$id = get_the_ID();

$views = (int) get_post_meta( $id, 'views', true );

$views++;

update_post_meta( $id, 'views', $views );

$emitter = new SocketIO\Emitter();

$emitter->emit( 'post views', $id, $views );

echo $views;

single.php

Page 74: WordPress Realtime - WordCamp São Paulo 2015

require_once './vendor/autoload.php';

$id = get_the_ID();

$views = (int) get_post_meta( $id, 'views', true );

$views++;

update_post_meta( $id, 'views', $views );

$emitter = new SocketIO\Emitter();

$emitter->emit( 'post views', $id, $views );

echo $views;

single.php

Page 75: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

socket.on('post views', function(id, views) {

$('#post-' + id).text(views);

});

main.js

Page 76: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

socket.on('post views', function(id, views) {

$('#post-' + id).text(views);

});

main.js

Page 77: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

socket.on('post views', function(id, views) {

$('#post-' + id).text(views);

});

main.js

Page 78: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

socket.on('post views', function(id, views) {

$('#post-' + id).text(views);

});

main.js

Page 79: WordPress Realtime - WordCamp São Paulo 2015

var socket = io('http://localhost:3000');

socket.on('post views', function(id, views) {

$('#post-' + id).text(views);

});

main.js

Page 80: WordPress Realtime - WordCamp São Paulo 2015

the box!Think outsidethe box!Think outside

Page 81: WordPress Realtime - WordCamp São Paulo 2015

Fernando DaciukFullStack Engineer

Thanks!

/fdaciuk/talks npm install fdaciuk