LNMP swoole 的初步使用
1、安装swoole扩展
# 编译安装
# https://github.com/swoole/swoole-src/releases clone一份下来
cd swoole
sudo phpize (ubuntu 没有安装phpize可执行命令:sudo apt-get install php-dev来安装phpize)
sudo ./configure
sudo make
sudo make install
# pecl安装
pecl install swoole
sudo vim /etc/php/7.2/mods-available/swoole.ini
# 内容 写上: extension=/usr/lib/php/20170718/swoole.so (pecl安装之后有给你显示扩展安装的位子)
sudo ln -s /etc/php/7.2/mods-available/swoole.ini /etc/php/7.2/cli/conf.d/20-swoole.ini
2、使用swoole
TCP client 端
<?php
$client = new swoole_client(SWOOLE_TCP | SWOOLE_KEEP); //同步阻塞
$ret = $client->connect('127.0.0.1', 9906);
if(!$ret)
{
echo "Connect Server fail.errCode=".$client->errCode;
}
else
{
fwrite(STDOUT,'请输入');
$msg = trim(fgets(STDIN));
$client->send($msg);
$result = $client->recv(65535,swoole_client::MSG_PEEK | swoole_client::MSG_WAITALL); // 接收server过来的东西
echo $result;
}
TCP server 端
<?php
$serv = new swoole_server('0.0.0.0', 9906, SWOOLE_BASE, SWOOLE_SOCK_TCP);
//设置事件回调函数
$serv->on('connect', function ($serv, $fd) {
echo "Client:Connect.\n";
});
// 接受函数
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
echo 'cli:'.$data."\n";
$serv->send($fd, 'server: ' . $data."\n");
$serv->close($fd);
});
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$serv->start();
websocker client端 (使用JQ发送)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<input type="text" id="send_msg" >
<input type="button" value="发送" id="send_btn">
</head>
<body>
</body>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
var ws = new WebSocket("ws://127.0.0.1:9906");
ws.onopen = function()
{
console.log("open");
ws.send("hello")
};
ws.onmessage = function(evt)
{
console.log(evt.data)
};
ws.onclose = function(evt)
{
console.log("WebSocketClosed!");
};
ws.onerror = function(evt)
{
console.log("WebSocketError!");
};
$('#send_btn').click(function (_this) {
var sendMsg = $('#send_msg').val()
if(sendMsg == ''){
alert('请发送消息')
return
}
ws.send(sendMsg)
})
</script>
</html>
websocker server 端
<?php
$server = new swoole_websocket_server("127.0.0.1", 9906);
$server->set(array(
'worker_num' => 8,
'max_request' => 10000,
'max_conn' => 100000,
'dispatch_mode' => 2,
'debug_mode'=> 0,
'daemonize' => false,
'log_level' => SWOOLE_LOG_ERROR, // 日志等级 关闭开启debug
'trace_flags' => SWOOLE_TRACE_SERVER, // 日志等级 关闭开启debug
));
$server->on('open', function (swoole_websocket_server $server, $request) {
echo "server: handshake success with fd:{$request->fd}\n"; // 客户端链接则执行
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
// 客户端发送信息则执行
echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
foreach ($server->connections as $fd){
$server->push($fd, "this is server:".$frame->data);
}
// $server->push($frame->fd, "this is server:".$frame->data);
});
$server->on('close', function ($ser, $fd) {
echo "client {$fd} closed\n";
});
$server->start();
websocker client 端 (自己测试用的一个破IM)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<br>
设置昵称:<input type="text" id="name" ><input type="button" value="设置" id="set_btn">
<br><br><br><br>
发送给谁:<input type="text" id="user" >
<br>
发送什么:<input type="text" id="send_msg" >
<br>
<input type="button" value="发送" id="send_btn">
</head>
<body>
</body>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
var ws = new WebSocket("ws://127.0.0.1:9906");
ws.onopen = function()
{
console.log("open");
// ws.send("hello")
};
ws.onmessage = function(evt)
{
console.log(evt.data)
};
ws.onclose = function(evt)
{
console.log("WebSocketClosed!");
};
ws.onerror = function(evt)
{
console.log("WebSocketError!");
};
$('#send_btn').click(function (_this) {
var sendMsg = $('#send_msg').val();
var user = $('#user').val();
if(sendMsg == ''){
alert('请发送消息');
return
}else if (user){
var arr = [ 'push',user,sendMsg, ];
}else{
var arr = [ 'message',sendMsg, ];
}
ws.send(arr)
});
$('#set_btn').click(function (_this) {
var sendMsg = $('#name').val();
var arr = [ 'set_name',sendMsg, ];
// JSON.stringify( arr );
if(sendMsg == ''){
alert('请写上昵称消息');
return
}
ws.send(arr)
});
</script>
</html>
websocker server 端 (自己测试用的一个破IM)
<?php
function getIp(){
return '127.0.0.1';//$_SERVER['REMOTE_ADDR'];
}
function getUserInfo()
{
$file_path = "newfile.txt";
if(file_exists($file_path)){
$str = file_get_contents($file_path);//将整个文件内容读入到一个字符串中
$_SESSION['user_info'] = json_decode($str, true);
}
}
function saveUserInfo(array $data, int $fd, string $ip)
{
getUserInfo();
$_SESSION['user_info'][$ip] = $data[$ip];
file_put_contents('newfile.txt',json_encode($_SESSION['user_info']));
}
$userInfo = [];
$server = new swoole_websocket_server("127.0.0.1", 9906);
$server->set(array(
'worker_num' => 8,
'max_request' => 10000,
'max_conn' => 100000,
'dispatch_mode' => 2,
'debug_mode' => 0,
'daemonize' => false,
'log_level' => SWOOLE_LOG_ERROR, // 日志等级 关闭开启debug
'trace_flags' => SWOOLE_TRACE_SERVER, // 日志等级 关闭开启debug
));
$server->on('open', function (swoole_websocket_server $server, $request) {
// echo "server: handshake success with fd:{$request->fd}\n"; // 客户端链接则执行
$_SESSION['user_info'][ getIp() ]['fd'] = $request->fd;
saveUserInfo($_SESSION['user_info'],$request->fd,getIp());
});
$server->on('message', function (swoole_websocket_server $server, $frame) {
// 客户端发送信息则执行
$type = strstr($frame->data,",",true);
$data = substr(strstr($frame->data,","),1);
switch ($type){
case 'set_name': // 如果对方是改名
$_SESSION['user_info'][ getIp() ]['name'] = $data;
saveUserInfo($_SESSION['user_info'],$frame->fd,getIp());
$server->push($frame->fd, "this is server:改名成功-".$data);
break;
case 'message': // 公共广播
foreach ($server->connections as $fd){
$server->push($fd, "别人说:".$data);
}
// TODO 可以写个@某人
break;
case 'push': // 私聊 @某某:123456 push,12,12345645645
$pushFd = strstr($data,",",true);
$content = substr(strstr($data,","),1);
$server->push($pushFd, "别人对你说:".$content);
break;
}
});
$server->on('close', function ($ser, $fd) {
echo "client {$fd} closed\n";
});
$server->start();