前端js代码
var wsUrl = "ws://www.whl.com:9501";
var websocket = new WebSocket(wsUrl);
//实例对象的onopen属性
websocket.onopen = function(evt) {
console.log(11111111);
websocket.send("hello-sinwa");
console.log("conected-swoole-success");
}
// 实例化 onmessage
websocket.onmessage = function(evt) {
console.log("ws-server-return-data:" + evt.data);
}
//onclose
websocket.onclose = function(evt) {
console.log("close");
}
//onerror
websocket.onerror = function(evt, e) {
console.log("error:" + evt.data);
}
后端php 代码
$server = new swoole_websocket_server("0.0.0.0", 9501);
$server->on('open', function (swoole_websocket_server $server, $request) {
$redis = new \Redis();
//连接
$redis->connect('127.0.0.1', 6379);
$redis->sAdd('all_fd' , $request->fd);
echo "long-server: handshake success with fd{$request->fd}".PHP_EOL;
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
echo "long-receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}".PHP_EOL;
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$all_fd=$redis->sMembers('all_fd');
foreach ($all_fd as $v){
$server->push($v, "this is server");
}
});
$server->on('close', function ($ser, $fd) {
$redis = new \Redis();
//连接
$redis->connect('127.0.0.1', 6379);
$redis->sRem('all_fd' , $fd); // 移除容器中的TK
echo "long-client {$fd} closed".PHP_EOL;
});
$server->start();
后台守护进行
nohup php websocket.php >/dev/null 2>&1 &
查看进程
ps -aux |grep "php websocket.php"
杀死进程
kill -9 22234
5. 开机自启
通过前面的步骤,我们知道如何开启和关闭一个php进程,但是,在实际的应用中,我们不可能每次都是手动开启,这样我们就会损失掉一部分业务数据,所以我们必须要让该进程开机自动运行,步骤如下:
在/etc/rc.local文件中,将nohup php websocket.php >/dev/null 2>&1 &这个命令加入即可。
6.当然swoole没这么麻烦。只要在set方法加 'daemonize' => 1即可,这里只是提供参照对比一下是不是能达到同样的效果