swoole聊天室demo

实现效果

socket聊天室

github demo

SWOOLE是什么

官网如是说:Swoole:面向生产环境的 PHP 异步网络通信引擎

使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。

安装

//linux:
pecl install swoole
//mac
brew install swoole

以上平台笔者都测试过,顺利安装,自己修改下ini extension

使用

<?php
$server = new swoole_websocket_server("127.0.0.1", 9502);

$server->on('open', function($server, $req) {
    echo "connection open: {$req->fd}\n";
});

$server->on('message', function($server, $frame) {
    echo "received message: {$frame->data}\n";
    $server->push($frame->fd, json_encode(["hello", "world"]));
});

$server->on('close', function($server, $fd) {
    echo "connection close: {$fd}\n";
});

$server->start();

是不是感觉so easy

实战

要想实现能聊天自己还需要做点东西

//客户端与服务器连接时触发
$server->on('open')

//客户端向服务器发送消息时触发
$server->on('message')

//连接关闭时触发
$server->on('close')

明白个自己的运行时间,我们就可以在对应的时间加上逻辑了,以下为例子(http://lts.yuuuu.wang)的源码:

#! /usr/local/bin/php
<?php
date_default_timezone_set('Asia/Shanghai');

$server = new swoole_websocket_server("192.168.13.201", 9502);

//connects方法主要是管理当前在线用户的,主要是为了广播时能将消息退给各自客户端,目前笔者是通过写文件,实际应用可以更换其他方式保存
connects(0 , 'clear');

$server->on('open', function($server, $req){
    connects($req->fd);
});

$server->on('message', function($server, $frame){
    $msg = explode('~' , $frame->data);

    $rep = ['code' => $msg[0] , 'user' => $msg[1] , 'msg' => $msg[2] , 'time' => date('H:i:s')];

    $connects = connects(0,'read');

    foreach($connects as $v) {
        $server->push($v, json_encode($rep));
    }


});

$server->on('close', function($server, $fd){
    connects($fd , 'out');
});

$server->start();

/**
 * 对在线用户进行管理
 * @param int $cid 客户端连接对应在服务端的socket id
 * @param string $op 操作 上线 in 下线 out 读取在线列表 read 清空在线列表 clear
 * @return array|bool|mixed|string|void
 */
function connects($cid = 0 , $op = 'in')
{
    $connects = file_get_contents('/tmp/t.php');
    $connects = @json_decode($connects , true);

    switch($op){
        case 'out':
            if(!$connects){
                return;
            }
            if(in_array($cid , $connects)){
                $connects = array_filter($connects , function($v) use ($cid){
                    if($v != $cid){
                        return true;
                    }
                });
                file_put_contents('/tmp/t.php' , json_encode($connects));
            }
            break;
        case 'read':
            if(!$connects){
                return;
            }
            return $connects;
            break;
        case 'clear':
            file_put_contents('/tmp/t.php' , json_encode([]));
            break;
        default:
            if(!$connects){
                $connects = [];
            }
            $n = array_merge($connects , array($cid));
            file_put_contents('/tmp/t.php' , json_encode($n));
            break;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值