Swoole扩展实现PHP WebSocket服务端示例

南乔
南乔
发布时间:2026-10-14| 9人浏览过
原创

Swoole为PHP提供了强大的异步网络编程能力,其中WebSocket是构建实时聊天和数据推送的常用协议。本文将通过一个完整的代码示例,演示如何基于Swoole的Protocol接口实现一个简单的WebSocket服务器。

环境准备

在开始编写代码之前,请确保开发环境中已正确安装并启用了Swoole扩展。您可以通过运行 php --ri swoole 来检查Swoole的版本信息及配置状态。本示例适用于支持Swoole协议层的PHP环境。

核心逻辑与代码实现

第1步:定义WebSocket协议处理类

Swoole提供了一个基类 Swoole\Network\Protocol\WebSocket,开发者只需继承该类并重写特定回调函数即可处理WebSocket生命周期事件。我们需要关注两个关键场景:

  • 客户端下线(onClose):当连接断开时,可以选择通知其他在线用户或执行资源清理。
  • 消息接收(onMessage):处理客户端发送的数据,并进行响应或广播。

以下代码展示了一个基础的协议处理类结构:

复制代码 代码如下:
<?php
define('DEBUG', 'on');
define("WEBPATH", str_replace("\\","/", __DIR__));
// 注意:实际项目中需确保 libs_config.php 存在且正确加载
require __DIR__ . '/../libs/lib_config.php';

class WebSocket extends Swoole\Network\Protocol\WebSocket
{
    /**
     * 客户端断开连接时的回调
     */
    function onClose($serv, $client_id, $from_id)
    {
        // 此处可添加将下线消息发送给所有人的逻辑
        // 例如:$this->broadcast($client_id, "User offline: " . $client_id);
        parent::onClose($serv, $client_id, $from_id);
    }

    /**
     * 接收到客户端消息时的回调
     */
    function onMessage($client_id, $ws)
    {
        // 记录接收到的消息
        $this->log("onMessage: ".$client_id.' = '.$ws['message']);
        
        // 向当前客户端返回确认信息
        $this->send($client_id, "Server received: ".$ws['message']);
        
        // 若需群发,可调用 broadcast 方法
        // $this->broadcast($client_id, $ws['message']);
    }

    /**
     * 广播消息给所有其他连接的用户
     */
    function broadcast($client_id, $msg)
    {
        foreach ($this->connections as $clid => $info)
        {
            if ($client_id != $clid)
            {
                $this->send($clid, $msg);
            }
        }
    }
}

第2步:初始化并启动WebSocket服务

创建好协议处理类后,需要实例化服务对象,绑定协议,并配置服务器的运行参数。主要包括设置监听地址、端口、Worker进程数以及日志输出方式。

$AppSvr = new WebSocket();
// 加载外部配置文件(如有需要)
$AppSvr->loadSetting(__DIR__."/swoole.ini");

// 设置日志输出为控制台Echo,便于调试
$AppSvr->setLogger(new \Swoole\Log\EchoLog(true));

// 创建网络服务器,监听所有IP的9503端口
$server = new \Swoole\Network\Server('0.0.0.0', 9503);

// 绑定我们自定义的WebSocket协议处理类
$server->setProtocol($AppSvr);

// 启动服务,配置4个Worker进程以处理并发请求
$server->run(array('worker_num' =>4));

关键点说明

  • 协议继承:通过继承 Swoole\Network\Protocol\WebSocket,Swoole会自动处理WebSocket协议的握手、分帧解析等底层细节,开发者只需专注于业务逻辑。
  • 广播机制:示例中的 broadcast 方法遍历当前连接列表,排除发送者本身,实现群发功能。在实际应用中,需注意性能优化,如使用频道组管理。
  • 进程模型:配置 'worker_num' => 4 表示启动4个工作进程来处理连接,这能显著提升服务器的并发处理能力。
  • 调试模式:代码中开启了DEBUG常量,并使用了 EchoLog 将日志打印到标准输出,方便在开发和测试阶段观察消息流转。

运行与验证

保存上述代码为 websocket_server.php 并在终端运行:

php websocket_server.php

服务启动后,可以使用任意WebSocket客户端(如浏览器控制台、Postman或专门的WebSocket测试工具)连接到 ws://your-ip:9503 进行双向通信测试。发送消息后,服务器应返回带有“Server received”前缀的确认信息,并在断开连接时触发 onClose 逻辑。

以上就是Swoole扩展实现PHP WebSocket服务端示例的详细内容,更多关于Swoole实战开发的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。