使用socket.io-php-emitter来从socket.io的外部(简易API)尝试发射emit
你要做什么?
上次,我写了一篇关于使用socket.io制作示例聊天应用的文章,这次我打算对其进行一些扩展,使其可以从php向socket.io进行emit。我会将这些作为备忘录写下来。
在官方网页上写着如下内容。
向外界发送消息
在某些情况下,您可能希望从Socket.IO进程之外的环境中向Socket.IO命名空间/房间的套接字发送事件。有几种方法可以解决这个问题,例如实现自己的通道来发送消息到进程中。
为了方便处理这种情况,我们创建了两个模块:
socket.io-redis
socket.io-emitter
简单来说,如果要从socket.io进程的外部向namespace或room发送事件,需要实现以下两个工具(socket.io-redis/socket.io-emitter)。但是,仅仅实现这两个工具的话,只能从JavaScript中调用,如果在使用Ruby或PHP编写API的情况下,可维护性可能不太好。所以,以下工具可能会有所帮助。
socket.io-php-emitter是socket.io-emitter的PHP实现。
因为有人写了socket.io-emitter的PHP实现版本,所以这次我们将使用它,并通过PHP来向socket.io的特定room发出emit。
这次的环境
-
- ec2インスタンス (Amazon Linux AMI release 2014.09)
-
- Apache (v2.2.29)
-
- PHP (v5.3.29)
-
- redis (v2.8.19)
-
- phpredis (v2.2.5)
-
- socket.io (v1.3.5)
-
- socket.io-emitter (v0.2.0)
- socket.io-redis (v0.1.4)
步骤
※ 假定已经准备好了httpd和php环境。
-
- 安装redis相关工具并启动redis服务器
-
- 安装socket.io-php-emitter(根据需要还可以安装composer)
-
- 安装socket.io-redis和socket.io-emitter
-
- 更新server.js并重新启动node服务器
-
- 准备简易API
-
- 稍微更新iOS端的源代码
- 准备就绪!
1. 安装与启动Redis相关工具
Redis的安装
在AWS EC2上安装Redis。以前使用make进行安装,但是使用yum进行安装可以秒速完成,并且还会自动配置设置文件…非常感谢。
搭建Redis运行环境
在我的环境中,配置文件”conf”被放置在”/etc/redis.conf”中。我需要稍微修改其中的设置。
37c37
< daemonize yes
---
> daemonize no
之后,您可以按照以下方式输入命令。
# vm.overcommit_memory=1を現状で反映させる
sysctl vm.overcommit_memory=1
# 末尾に vm.overcommit_memory = 1 を追加
vi /etc/sysctl.conf
# redisログのgroup:userを変更
chown redis:redis /var/log/redis/redis.log
# 実行
/etc/init.d/redis start
# 実行確認
ps ax | grep [r]edis
29143 ? Ssl 0:19 redis-server 127.0.0.1:6379
# サーバ再起動で自動的に実行されるように
chkconfig redis on
# 2~5までonならOK
chkconfig --list redis
※ 如果通过 yum 安装,执行脚本已经被放置在 /etc/init.d/redis 目录下了。
※ Redis 组/用户也会自动添加,这里就不再赘述(什么时候添加的呢?)。
※ 参考资料1: Redis 安装。
※ 参考资料2:在 SAkura 的 VPS 上安装 Redis。
安装 phpredis。
sudo yum -y install php-pecl-redis --enablerepo=epel
※ 参考:尝试使用PHP与Redis
2. 安装 socket.io-php-emitter(根据需要安装composer)
安装composer
因为本次使用的工具是要作为composer包进行安装的,所以首先必须安装composer才能开始。
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
# 必要であればpathをbashrcやzshrcに追加
# PATH=$PATH:/usr/local/bin
# vi ~.bashrc
参考:使用vagrant和CentOS来安装composer。
安装 socket.io-php-emitter
# documentrootへ移動
cd /var/www/html
# ソースを落とす & ソースディレクトリへ移動
git clone https://github.com/rase-/socket.io-php-emitter.git
cd socket.io-php-emitter/
# composerで一括インストール
# (自分の環境では、the requested PHP extension dom is missing from your systemっていうエラーがでたので、一旦 yum install php-xml して再度 composer installしました)
composer install
安装socket.io-redis和socket.io-emitter。
# server.jsがあるディレクトリまで移動
cd /path/to/server.js
# インストール
npm install socket.io-redis
npm install socket.io-emitter
4. 更新server.js并重新启动node服务器
# 2,3行目に下記を追加
1a2,3
> var redis = require('socket.io-redis');
> var adapter = io.adapter(redis({ host: '127.0.0.1', port: 6379 }));
# node-server再度実行
node server
提供简易API。
Explanation:
The original phrase “簡易APIを用意” is already in Chinese, so there is no need for further translation. It means “to provide a simple API.”
我們在伺服器端準備一個類似這樣的簡易API。
<?php
header('Content-type: application/json');
$json_string = file_get_contents('php://input');
$json = json_decode($json_string);
$sepStr = ',';
$param = $json->param;
$params = split($sepStr, $param);
$room = $params[0];
if(empty($room) || empty($param)){
exit;
}
//echo 'post to' . $room;
require('src/Emitter.php');
$redis = new \Redis();
$redis->connect('127.0.0.1', '6379');
$emitter = new SocketIO\Emitter($redis);
$emitter->in($room)->emit('update', $param);
echo json_encode(array('param' => $param));
?>
6. iOS方面的源代码也稍作更新。
暫時性地,我們改變了綽號,並確保了 http POST 請求的發送。相關部分如下所示。
AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSString *postFilePath = [NSString stringWithFormat:@"%@/%@",
kHTTPHostName, kEmitFilePath];
[manager POST:postFilePath
parameters:@{@"param":[param paramStr]}
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"posted");
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@", error);
}];
※ 源代码已放置在下方链接中。
https://github.com/mitolog/SIOChat
7. 准备出发!
我将运行第6个源代码,并尝试在一个房间中有2个或更多人参加。然后,我将尝试更改我的昵称,并向房间内的其他成员发送消息,内容为“将昵称从“hogehoge”更改为“fugafuga”。
评论
-
- 概念的にはなんとなく分かるのだけど、中身がそんなに理解できていないので、要勉強
- ステキな勉強会があったら是非いきたい
(离题一下)看起来能学到一些东西的东西
-
- 今更だけどSocket.ioについてまとめてみる
-
- Socket.IO, Redisを使用し各ゲーム間でプッシュ通知するシステム
- 今日から始めるNode.jsコードリーディング – libuv / V8 JavaScriptエンジン / Node.jsによるスクリプトの実行
以上就是了。