tp6 think-swoole3 websocket

本文介绍如何在ThinkPHP框架中利用Swoole组件创建WebSocket服务,包括配置监听事件、构造WebSocket事件处理类、连接与断开事件的处理,并提供启动服务及前端测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在项目根目录下执行:

php think make:listener WebSocketEvent

swoole.phpwebsocket['subscribe']写入监听并开启websocket

'enable' => true,
'subscribe' => [
    app\listener\WebSocketEvent::class
],

WebsocketEvent.php

<?php
declare (strict_types = 1);

namespace app\listener;

use app\Request;
use Swoole\Server;
use think\Container;
use think\swoole\Table;
use think\swoole\Websocket;
use think\cache\driver\Redis;

class WebsocketEvent
{
	protected $websocket = null;	//websocket对象
	protected $server = null;	//server对象
	protected $redis = null;	//redis对象

	public function __construct(Server $server, Websocket $websocket)
    {
        $this->websocket = $websocket;//依赖注入的方式
		$this->server = $server;
		$this->redis = new Redis;
	}

    //onOpen触发的事件,传入的是一个request对象
	public function onConnect(Request $request)
    {
        //通过websocket的上下文取得fd:$this->websocket->getSender()
		$fd = $this->websocket->getSender();
		//$this->server->push($fd, 'hello swoole');
		//把用户存到redis
		$this->redis->zadd('member', 0, $fd);
		//广播用户上线
		$members = $this->redis->zrange('member', 0, -1);
		foreach($members as $member){
			$this->server->push((int)$member, "{$fd}上线");
		}
    }

    //onClose触发的事件
    public function onClose()
    {
        //将离线的用户从关系表中移除
		$fd = $this->websocket->getSender();
		$res = $this->redis->zrem('member', $fd);
		//var_dump($fd, $res);
    }
}

开启服务

php think swoole
Starting swoole http server...
Swoole http server started: <http://127.0.0.1:88>
You can exit with `CTRL-C`

前端测试代码

if ("WebSocket" in window)
            {
               alert("您的浏览器支持 WebSocket!");
               
               // 打开一个 web socket
               var ws = new WebSocket("ws://127.0.0.1:88");
                
               ws.onopen = function()
               {
                  // Web Socket 已连接上,使用 send() 方法发送数据
                  ws.send("发送数据");
                  console.log("数据发送中...");
               };
                
               ws.onmessage = function (evt) 
               { 
                  var received_msg = evt.data;
                  console.log("数据已接收...");
               };
                
               ws.onclose = function()
               { 
                  // 关闭 websocket
                  console.log("连接已关闭..."); 
               };
            }
            
            else
            {
               // 浏览器不支持 WebSocket
               alert("您的浏览器不支持 WebSocket!");
            }

参考于 https://www.kancloud.cn/book_xwy/think-swoole3/1720825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值