WebSocket Chat

这个简单的界面允许您输入消息并将其发送到 WebSocket 服务器。所有连接的客户端都会收到该消息并显示它。

第 5 步:测试 WebSocket 连接

  1. 通过运行 php start_server.php 启动 WebSocket 服务器。
  2. 在浏览器中打开index.html。
  3. 在另一个浏览器或选项卡中打开同一页面以模拟多个客户端。

当您从一个客户端发送消息时,该消息将显示在所有连接的客户端的浏览器中。


在 PHP 中使用 WebSocket 的优点


PHP 中 WebSocket 的用例


结论

WebSockets 为客户端和服务器之间的实时、全双工通信提供了强大的解决方案,非常适合聊天系统、实时通知和其他实时应用程序。通过将 PHP 与 Ratchet 等库结合使用,您可以轻松设置 WebSocket 服务器并将其集成到您的应用程序中,以提高用户参与度和响应能力。

","image":"http://www.luping.net/uploads/20240930/172769436566fa861d5b103.jpg","datePublished":"2024-09-30T19:06:05+08:00","dateModified":"2024-09-30T19:06:05+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 了解 PHP 中的 WebSocket

了解 PHP 中的 WebSocket

发布于2024-09-30
浏览:467

Understanding WebSockets in PHP

WebSockets 通过单个 TCP 连接提供实时、全双工通信通道。与 HTTP 不同,HTTP 中客户端向服务器发送请求并等待响应,WebSocket 允许客户端和服务器之间进行连续通信,而无需多次请求。这非常适合需要实时更新的应用程序,例如聊天应用程序、实时通知和在线游戏。

在本指南中,我们将探讨 WebSocket、它们的工作原理以及如何在 PHP 中实现它们。


什么是 WebSocket?

WebSockets 支持 Web 浏览器(或任何其他客户端)和服务器之间的交互式通信。以下是 WebSocket 的关键方面:

  1. 全双工通信:客户端和服务器都可以随时向对方发送消息,使连接比传统的 HTTP 轮询更加高效。
  2. 持久连接:一旦建立,WebSocket 连接将保持打开状态,直到客户端或服务器显式关闭为止。
  3. 低延迟:由于 WebSocket 无需为每个请求打开新连接,因此减少了延迟,使其成为实时通信的理想选择。

WebSocket 的工作原理

  1. 握手:通信以 HTTP 请求开始。客户端发送带有 Upgrade 标头的 HTTP 请求,将连接从 HTTP 切换到 WebSockets。
  2. 连接已建立:一旦服务器确认握手,连接就建立了,客户端和服务器都可以开始发送和接收消息。
  3. 消息传递:数据通过帧传输,帧是轻量级的,可以来回发送,无需 HTTP 标头的开销。
  4. 连接终止:客户端或服务器都可以终止连接。

何时使用 WebSockets

  • 实时应用程序:例如聊天应用程序、实时通知和协作编辑。
  • 游戏:适用于需要频繁更新的多人在线游戏。
  • 实时动态:从物联网设备流式传输股票价格、体育比分或实时数据。
  • 协作工具:适用于 Google Docs 等多个用户需要实时查看更新的应用。

在 PHP 中实现 WebSockets

要在 PHP 中实现 WebSocket,您可以使用 Ratchet 等库,这是一个专门为使用 WebSocket 进行实时双向通信而设计的 PHP 库。


使用 Ratchet 逐步实现 WebSocket

第 1 步:通过 Composer 安装 Ratchet

首先,您需要安装 Ratchet 库。假设你已经安装了 Composer,你可以运行以下命令:

composer require cboden/ratchet

第 2 步:在 PHP 中创建 WebSocket 服务器

让我们创建一个简单的 WebSocket 服务器来处理连接和消息。

  1. 在WebSocketServer.php中创建WebSocket服务器类
clients = new \SplObjectStorage;
    }

    // Called when a new client connects
    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection: ({$conn->resourceId})\n";
    }

    // Called when a client sends a message
    public function onMessage(ConnectionInterface $from, $msg) {
        echo "New message: $msg\n";

        foreach ($this->clients as $client) {
            if ($from !== $client) {
                // Send the message to everyone except the sender
                $client->send($msg);
            }
        }
    }

    // Called when a connection is closed
    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection closed: ({$conn->resourceId})\n";
    }

    // Called if an error occurs
    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Error: {$e->getMessage()}\n";
        $conn->close();
    }
}

此类实现 Ratchet 的 MessageComponentInterface,它定义了处理新连接、传入消息、关闭连接和错误的方法。

第 3 步:运行 WebSocket 服务器

创建一个新的PHP脚本来启动WebSocket服务器,例如start_server.php。

run();

您可以通过运行此脚本来启动服务器:

php start_server.php

服务器现在将在 ws://localhost:8080 上运行。

第 4 步:创建前端以连接到 WebSocket 服务器

现在,让我们使用 jQueryJavaScript 创建一个 HTML 文件来连接到 WebSocket 服务器。

  1. 创建一个HTML文件index.html:


    WebSocket Chat

WebSocket Chat

这个简单的界面允许您输入消息并将其发送到 WebSocket 服务器。所有连接的客户端都会收到该消息并显示它。

第 5 步:测试 WebSocket 连接

  1. 通过运行 php start_server.php 启动 WebSocket 服务器。
  2. 在浏览器中打开index.html。
  3. 在另一个浏览器或选项卡中打开同一页面以模拟多个客户端。

当您从一个客户端发送消息时,该消息将显示在所有连接的客户端的浏览器中。


在 PHP 中使用 WebSocket 的优点

  • 实时更新:WebSocket 提供实时更新,无需 HTTP 轮询的开销。
  • 较低延迟:由于连接保持打开状态,因此可以立即发送消息,从而减少延迟。
  • 双向通信:服务器和客户端都可以同时向对方发送消息,这与传统的 HTTP 通信是由客户端发起的不同。

PHP 中 WebSocket 的用例

  • 聊天应用程序:WebSockets 非常适合需要立即向所有用户发送消息的实时聊天应用程序。
  • 实时通知:适用于需要推送实时通知的应用(例如社交媒体、股票价格)。
  • 实时协作工具:WebSockets 支持实时协作,例如实时文档编辑。
  • 在线游戏:多人在线游戏受益于 WebSockets 的低延迟通信。

结论

WebSockets 为客户端和服务器之间的实时、全双工通信提供了强大的解决方案,非常适合聊天系统、实时通知和其他实时应用程序。通过将 PHP 与 Ratchet 等库结合使用,您可以轻松设置 WebSocket 服务器并将其集成到您的应用程序中,以提高用户参与度和响应能力。

版本声明 本文转载于:https://dev.to/mdarifulhaque/understanding-websockets-in-php-2cli?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 并行 JavaScript 机
    并行 JavaScript 机
    作者:Vladas Saulis,PE Prodata,克莱佩达,立陶宛 2024 年 5 月 18 日 抽象的 本文提出了一种新的编程模型,可以以简单且自动平衡的方式利用多核 CPU 系统。该模型还提出了一种更简单的编程范例,用于在大多数大规模并行计算领域(例如天气预报、核物理、搜索引擎等)开发并...
    编程 发布于2024-11-06
  • 推荐项目:人事管理系统数据库设置
    推荐项目:人事管理系统数据库设置
    LabEx 的这个综合项目提供了深入研究数据库管理世界的宝贵机会,重点是人事管理系统的创建和实施。无论您是新手数据库管理员还是经验丰富的开发人员,这种实践经验都将为您提供必要的技能,以便在关系数据库环境中有效管理和操作数据。 深入了解数据库基础知识 该项目首先引导您完成使用 sudo...
    编程 发布于2024-11-06
  • Python 中实例方法和类方法有什么区别?
    Python 中实例方法和类方法有什么区别?
    类与实例方法Python 的 PEP 8 风格指南建议使用“self”作为实例方法的第一个参数,使用“cls”作为类方法的第一个参数。理解这两类方法之间的区别对于有效的面向对象编程至关重要。实例方法实例方法与类的特定实例相关联。它们对实例的数据进行操作,并且通常接收“self”作为它们的第一个参数。...
    编程 发布于2024-11-06
  • 将 AdoptiumJDK 源代码加载到 Eclipse IDE 中
    将 AdoptiumJDK 源代码加载到 Eclipse IDE 中
    AdoptiumJDK 的安装程序中没有内置源代码文件,如果您需要通过 Eclipse IDE 检查如何使用任何本机 JDK 方法,这是不可能的。 按照以下步骤在Eclipse IDE中加载源代码: 访问 AdoptiumJDK 官方网站并按所需的 JDK 版本进行过滤,在我的例子中是 11.0.2...
    编程 发布于2024-11-06
  • 绝对定位与相对定位:为什么它们的行为如此不同?
    绝对定位与相对定位:为什么它们的行为如此不同?
    了解绝对位置与相对位置:宽度、高度等处理网页上的元素定位时,了解这些概念绝对位置与相对位置的区别至关重要。让我们深入探讨经常引起疑问的四个关键点:1。相对宽度与绝对宽度为什么相对定位的div自动占据100%宽度,而绝对定位的div只占据内容宽度?原因是设置位置:absolute 从文档结构的正常流程...
    编程 发布于2024-11-06
  • Python、Node js 和 PHP 中用于验证码识别的顶级模块
    Python、Node js 和 PHP 中用于验证码识别的顶级模块
    在我们的自动化时代,大多数解决方案都可以免费找到,我现在不是在谈论解决数学问题,而是稍微复杂的任务,例如数据解析,和我们的例子一样,还有 recapcha 识别。但如何找到一个好的模块呢?毕竟,随着技术的发展,每个人都得到了它,无论是认真的开发人员还是彻头彻尾的骗子。 我分析了验证码识别模块的市场,...
    编程 发布于2024-11-06
  • 以下是一些标题选项,重点关注问题格式和核心内容:

**选项 1(直接且简洁):**

* **如何在 PHP 中高效地循环多维数组?**

**选项2
    以下是一些标题选项,重点关注问题格式和核心内容: **选项 1(直接且简洁):** * **如何在 PHP 中高效地循环多维数组?** **选项2
    在 PHP 中循环多维数组多维数组可能是解析的一个挑战,特别是在处理不同深度级别和非顺序索引时。考虑一个保存事件信息的数组,其中可以包含多个艺术家及其相应的链接,如下所示:array(2) { [1]=> array(3) { ["eventID"]...
    编程 发布于2024-11-06
  • 通过 Linting 提高代码质量
    通过 Linting 提高代码质量
    Whenever I start a new project, one of the first things I do is put in place a code linter. For the uninitiated, linters analyze your project and call...
    编程 发布于2024-11-06
  • 如何有效地执行JavaScript中的回调函数?
    如何有效地执行JavaScript中的回调函数?
    理解 JavaScript 中回调函数的本质在 JavaScript 中,回调函数提供了一种方便的机制,可以在另一个函数完成后执行一个函数它的执行。虽然概念很简单,但回调的最佳实现有时可能不清楚。让我们探讨一个简化的示例:var myCallBackExample = { myFirstFu...
    编程 发布于2024-11-06
  • Vue 框架简介
    Vue 框架简介
    What is Vue? from the Vue website Vue is a "progressive" JavaScript framework for building user interfaces. It works by build...
    编程 发布于2024-11-06
  • 逃离戏剧:为什么 HydePHP 是您的 WordPress 替代品
    逃离戏剧:为什么 HydePHP 是您的 WordPress 替代品
    WordPress 戏剧 随着 WordPress 生态系统面临前所未有的混乱,许多开发人员和网站所有者正在重新考虑他们的平台选择。最近 WordPress 联合创始人 Matt Mullenweg 和 WP Engine 之间的冲突凸显了 WordPress 社区内的控制、贡献和...
    编程 发布于2024-11-06
  • Go 中的并发模式;工作池和扇出/扇入
    Go 中的并发模式;工作池和扇出/扇入
    Go 以其卓越的并发模型而闻名,但许多开发人员只关注 goroutine 和通道。然而,工作池和扇出/扇入等并发模式提供了真正的效率。 本文将介绍这些高级概念,帮助您最大限度地提高 Go 应用程序的吞吐量。 为什么并发很重要 并发允许程序高效地执行任务,特别是在处理 I/O 操作、...
    编程 发布于2024-11-06
  • 如何在 C++ 中将单个字符转换为 std::string?
    如何在 C++ 中将单个字符转换为 std::string?
    从单个字符创建字符串人们可能会遇到需要将表示为 char 数据类型的单个字符转换为std::string。从字符串中获取字符很简单,只需在所需位置索引字符串即可。然而,相反的过程需要不同的方法。要从单个字符创建 std::string,可以使用多种方法:使用 std::string参数计数为 1:c...
    编程 发布于2024-11-06
  • JavaScript 变量名称中美元符号的含义是什么?
    JavaScript 变量名称中美元符号的含义是什么?
    JavaScript 变量名称中美元符号的意义在编程领域,命名约定的使用对于增强代码至关重要可读性并遵循最佳实践。在 JavaScript 中,美元符号 ($) 通常作为变量名称的前缀出现,特别是引用 jQuery 对象的变量名称。美元符号的用途是什么?与流行的看法相反,JavaScript 变量名...
    编程 发布于2024-11-06
  • 如何重新排列 CSS 网格布局中的列以实现移动响应?
    如何重新排列 CSS 网格布局中的列以实现移动响应?
    在 CSS 网格布局中重新排序列在 CSS 网格布局中,有多种技术可以修改列的顺序以实现具体布局。本问题探讨了重新排列移动布局列的可能性,例如将列移动到底部,同时在桌面布局上保持所需的列顺序。解决方案选项:grid-template-areas: 此属性允许您在网格内定义命名区域,然后将网格项分配给...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3