当前位置: 首页 > article >正文

thinkphp8.0\swoole的websocket应用

环境:centOS7.9、php8.3、thinkphp8.0\think-swoole4.1

我用的官方think-swoole插件

第一步:根据官方文档,需要安装此扩展插件

composer require topthink/think-swoole

第二步:在根目录下config文件夹下编辑swoole.php配置文件

    'http'=> [
        'enable'     => true,
        'host'       => '0.0.0.0', // 任意ip都可以访问http服务;
        'port'       => 8080, // 宝塔和阿里云、腾讯云的安全组需要开放此端口;
        'worker_num' => swoole_cpu_num(),
        'options'    => ['daemonize' =>  true], // 守护进程运行
    ],
    'websocket'  => [
        'enable'        => true, // 默认为false, 一定要开启
        'route' => false,  // 最大的坑,在做测试时,一定要关闭,否则调试不出结果;
        'handler'       => \think\swoole\websocket\Handler::class,
        'ping_interval' => 25000,
        'ping_timeout'  => 60000,
        'room'          => [
            'type'  => 'table',
            'table' => [
                'room_rows'   => 8192,
                'room_size'   => 2048,
                'client_rows' => 4096,
                'client_size' => 2048,
            ],
            'redis' => [
                'host'          => '127.0.0.1',
                'port'          => 6379,
                'max_active'    => 3,
                'max_wait_time' => 5,
            ],
        ],
        'listen'        => [
            'event' => \app\index\listener\WebsocketTest::class,//事件监听
            'close' => 'app\index\listener\WsClose',//关闭事件
        ],
        'subscribe'     => [],
    ],

第三步:我的框架是多应用模式,我创建了index应用;

// WebsocketTest.php; 路径: app\index\listener
namespace app\index\listener;
use think\Container;
use think\swoole\Websocket;
 
class WebsocketTest
{
	public $websocket = null;
	public function __construct(Container  $container){
		$this->websocket = $container->make(Websocket::class);
	}
	/**
	 * 事件监听处理
	 * @param $event
	 */
	public function handle($event)
	{
        echo '接收到事件,' . $event->type . '---' . $event->data;
        echo '--------';
        var_dump($event);
		$func = $event->type;
		$this->$func($event);
	}
	
	/**
	 * 测试类型
	 * @param $event
	 */
	public function test($event)
	{
		$msg = json_encode($event->data,256);
		$this->websocket->emit('callback', $msg);
	}
}

第四步:websocket关闭事件

namespace app\index\listener;
 
class WsClose
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        //
        echo '已经断开了';
    }
}

第五步:前端index.html

<html>
<head>
<title>websocket</title>
</head>
 
<body>
<h1>websocket功能</h1>
 
<input id="msg" type="text"/>
<button onclick="send()">发送</button>
 
<script>
    var ws = new WebSocket("ws://你的ip:8080");
 
	ws.onopen = function (){
        console.log("连接成功");
        var sendObj = {};
        sendObj.type = 'connect';
        sendObj.data = 'connect success';
        console.log('msg',JSON.stringify(sendObj));
        ws.send(JSON.stringify(sendObj));
    }
	
	ws.onclose = function () {
        console.log("连接失败")
    }
 
	ws.onmessage = function (evt) {
        console.log("数据已接收",evt);
    }
 
    function send(){
        console.log('运行到这里了');
        var msg = document.getElementById('msg').value;
        var sendObj = {};
        sendObj.type = 'mtest';
        sendObj.data = msg;
 
        console.log('msg',JSON.stringify(sendObj));
        ws.send(JSON.stringify(sendObj));
    }
</script>
</body>
</html>


http://www.kler.cn/a/611818.html

相关文章:

  • vue配置.eslintrc、.prettierrc详解
  • Android 问真八字-v2.1.7[看八字APP]
  • Netty源码—8.编解码原理二
  • 2025年具有AI招聘管理系统选型及攻略分享
  • Rust从入门到精通之入门篇:8.基本数据结构
  • 快速入手-基于Django-rest-framework的mixins混合类(五)
  • 自然语言处理(NLP)技术的应用面有哪些
  • 如何卸载雷池 WAF
  • 通义Qwen实战(2): vllm框架部署实战
  • Python----数据分析(电影数据分析)
  • 基于springboot+vue的凉州区助农惠农服务平台
  • 在 Ubuntu 上安装 Docker 的完整指南
  • 多网络选择路由(windows环境)
  • 5G NR PRACH格式
  • 青少年编程与数学 02-012 SQLite 数据库简介 01课题、数据库概要
  • scikit-learn 学习路线与知识结构全解析
  • 蓝桥杯高频考点——搜索(含C++源码)
  • 原型验证后客户推翻原有需求,如何止损
  • VMware Workstation 不支持在此主机上使用虚拟化性能计数器
  • 【AI学习】人工神经网络