LNMP swoole 的初步使用 亲测

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();

猜你喜欢

转载自blog.csdn.net/qq_14824885/article/details/82497032