PHP
Node.js
Redis
Socket.io
Composer

socket.io-php-emitter で PHP から emit する方法

More than 1 year has passed since last update.

動かすには Redis と PHP の Redis ライブラリが必要です。


使用したバージョン


  • PHP 7.0.10

  • Redis 3.2.3

  • Node.js 4.3.2

  • npm 2.14.12


サンプルソース


server/package.json

{

"name": "sample-server",
"main": "index.js",
"dependencies": {
"express": "^4.10.2",
"socket.io": "^1.4.8",
"socket.io-redis": "^1.0.0"
},
"devDependencies": {
"nodemon": "^1.9.1"
}
}


server/index.js

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

var http = require('http').Server(app);
var io = require('socket.io')(http);

var redis = require('socket.io-redis');
var adapter = io.adapter(redis({ host: '127.0.0.1', port: 6379 }));

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

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


server/index.html

<script src="https://cdn.socket.io/socket.io-1.4.8.js"></script>

<script>
var socket = io.connect('http://localhost:3000/');

socket.on('update', function(socket){
console.log('received emit!');
});
</script>


php-emitter/composer.json

{

"name": "sample-client",
"type": "project",
"require": {
"ashiina/socket.io-emitter": "^0.8.0"
}
}

2016年09月16日現在、rase/socket.io-emitter には互換性の問題があり動作しないため、代わりに有志の方が公開した修正版の ashiina/socket.io-emitter を使用しています。詳細は socket.io-php-emitter 0.7.0が動作しない問題 の記事を参照してください。


php-emitter/src/client.php

<?php

require_once('../vendor/autoload.php');

$redis = new \Redis();
$redis->connect('127.0.0.1', '6379');

$emitter = new SocketIO\Emitter($redis);
$emitter->emit('update', 'data'));


確認方法

以下のコマンドで node サーバを起動した状態で、ブラウザで index.html (http://localhost:3000/) を表示しておきます。

node index.js 

その状態で client.php を実行してコンソールに received emit! と表示されれば疎通成功です。🎉


疎通確認時のデバッグに便利な方法

最初試したときに中々繋がらなくて苦労したので、役に立ったデバッグ方法を書いておきます。


1. サーバのデバッグモードの有効化

デバッグモードを有効にして node サーバを起動しておくと emit 時に詳細な情報が流れます。

DEBUG=* node index.js


2. Redis のモニタリング

Redis を介して emit するため、Redis のコンソールで monitor コマンドを実行しておくと実際の通信内容 (msgpack) の文字列を確認できます。