版权声明:原创文章,转载声明出处 https://blog.csdn.net/weixin_43183475/article/details/82656248
实现效果
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;
}
}