利用PHP和Swoole实现实时通信完全教程

WBOY

WBOY

2023-06-28

1423人浏览

原创

随着互联网和移动通信技术的迅猛发展,实时通信越来越受到人们的关注。实时通信可以实现用户之间的即时信息传递、在线音视频通话、游戏对战等功能,为互联网应用带来了更多可能性。

本文将介绍如何利用 PHP 和 Swoole 实现实时通信,从简单的 WebSocket 应用开始,逐步介绍 Socket 编程的基础知识和 Swoole 的应用实践。阅读本文需要了解 PHP 基础和网络编程的基本知识。

一、WebSocket 基础

WebSocket 是一种基于 HTTP 协议的双向通信协议,它使用了一种被称为“握手”的协议来启用双向通信。WebSocket 连接的优点是它的开销非常小,通信的实时性很好,可以在客户端和服务器之间建立双向的实时通信。

WebSocket 的建立需要经历以下几个步骤:

1.浏览器向服务器发起 WebSocket 握手请求,请求头包含了一些关键字段,如 Upgrade、Connection、Sec-WebSocket-Key 等。

2.服务器处理客户端的 WebSocket 请求,如果符合规范,则返回一个响应报文,响应头中包含 Upgrade、Connection、Sec-WebSocket-Accept 等字段。

3.客户端收到服务器的响应报文,校验 Sec-WebSocket-Accept 字段,确认 WebSocket 握手成功建立。

4.双方可以开始进行数据通信,可以发送文本、二进制、Ping、Pong 等消息。

在 PHP 中使用 WebSocket,我们可以通过 Swoole 所提供的 WebSocket 服务来进行实现。下面介绍 Swoole 的基础应用。

二、Swoole 基础

1.安装 Swoole

在开始使用 Swoole 之前,我们需要在服务器上安装 Swoole 扩展。可以通过以下命令来安装:

pecl install swoole

PHP 8.5.5
PHP 8.5.5

PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。

下载

或者通过源码安装:

$ wget https://github.com/swoole/swoole-src/archive/v4.3.3.tar.gz
$ tar zxvf v4.3.3.tar.gz
$ cd swoole-src-4.3.3
$ phpize
$ ./configure
$ make && make install --with-swoole

  1. Swoole WebSocket 服务

下面我们来实现一个简单的 WebSocket 服务,监听 9501 端口,当客户端与服务器建立连接时,向客户端发送 hello 消息。

<?php $server = new SwooleWebSocketServer("0.0.0.0", 9501);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "new client connected
";
    $server->push($request->fd, "hello");
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    echo "received message: {$frame->data}
";
});

$server->start();

在该代码中,我们创建了一个新的 WebSocket 服务器,并监听了 9501 端口。在客户端与服务器建立连接时,会触发 open 事件,向客户端发送 hello 消息。当客户端向服务器发送消息时,会触发 message 事件,我们可以通过 echo 输出客户端发送的信息。

在启动上面的代码后,我们可以使用浏览器或者 WebSocket 客户端来连接该服务器:

let ws = new WebSocket('ws://127.0.0.1:9501');
ws.onopen = function(event) {
    console.log('WebSocket connected');
};
ws.onmessage = function(event) {
    console.log('Received:', event.data);
};
ws.send('Hello, Server');

在客户端成功连接后,控制台会输出以下信息:

WebSocket connected
Received: hello

表示客户端已经成功接收到服务器发送的 hello 消息。

三、实现实时聊天应用

下面,让我们来实现一个实时聊天应用,允许多个用户在一个聊天室内实时通信。这需要我们继续扩展上面的 WebSocket 服务器,实现聊天室的基本功能。

<?php $server = new SwooleWebSocketServer("0.0.0.0", 9501);

$server->set([
    'worker_num' => 2,    //启动2个Worker进程
]);

$server->on('open', function (SwooleWebSocketServer $server, $request) {
    echo "new client connected
";
    foreach($server->connections as $fd) {
        $server->push($fd, "{$request->fd} joined the room");
    }
});

$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    foreach($server->connections as $fd) {
        if ($fd != $frame->fd) {
            $server->push($fd, "user {$frame->fd}: {$frame->data}");
        }
    }
});

$server->on('close', function ($server, $fd) {
    echo "client {$fd} closed
";
    foreach($server->connections as $fds) {
        $server->push($fds, "{$fd} quited the room");
    }
});

$server->start();

在上面的代码中,我们添加了对 open 和 close 事件的处理。当有用户连接或者关闭连接时,会向其他连接的用户发送加入或离开聊天室的消息。当某个用户在聊天室内发送消息时,会将该消息广播给其他在线用户。

在启动上面的代码后,我们可以使用多个浏览器窗口分别连接服务器,进入同一个聊天室。当某个用户发送消息时,其他的用户可以实时地接收到该消息。

本文介绍了如何利用 PHP 和 Swoole 实现实时通信,从基础的 WebSocket 应用到实时聊天室应用。Swoole 提供了更加灵活的异步编程方式,使得编写高性能、高并发、低延时的应用变得更加容易。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php swoole

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

10

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

火山引擎对象存储使用教程
火山引擎对象存储使用教程

火山引擎对象存储适合用于网站图片、视频文件、备份数据、静态资源和应用附件管理。本专题整理TOS控制台入口、存储桶创建、地域选择、权限设置、文件上传、访问链接生成、CDN加速、费用查看和常见上传或访问失败问题,帮助用户快速掌握对象存储基础操作。

2026.08.04

1

10

火山引擎云服务器使用教程
火山引擎云服务器使用教程

火山引擎云服务器使用教程适合第一次购买、部署和管理云服务器的用户参考。本专题整理控制台入口、实例创建、地域和配置选择、系统镜像设置、安全组放行、远程连接、网站部署、续费计费和常见连接失败问题,帮助用户快速完成云服务器基础使用流程。

2026.08.04

5

10

火山引擎API Key绑定大模型教程
火山引擎API Key绑定大模型教程

火山引擎API Key怎么绑定大模型适合需要在火山方舟、应用后台、脚本工具或AI编程软件中调用模型的开发者参考。本专题整理控制台服务开通、API Key创建、模型权限检查、模型ID选择、Base URL填写、调用测试和鉴权失败排查,帮助用户完成从密钥到模型调用的配置流程。

2026.08.04

2

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习