PHP中的WebSockets:无需魔法创建实时应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的WebSockets:无需魔法创建实时应用

\n\n

您是否曾想过,为什么现代Web应用中的通知能即时到达,而聊天功能无需不断按F5刷新?秘诀在于WebSockets。是的,PHP也能实现实时功能。在本文中,我们将探讨如何让PHP与WebSockets协同工作,编写一个实时聊天和通知系统,最重要的是,无需痛苦和多余的库。

\n\n

如果您习惯认为PHP是“请求-响应”模式,请准备好感到惊讶。借助PHP中的WebSockets,您可以创建完整的实时应用:从简单的聊天到多人在线游戏。而这一切,都使用您喜爱的语言。

\n\n

什么是WebSockets,PHP为什么需要它们?

\n\n

WebSocket是客户端与服务器之间的双向通信协议。与传统的HTTP不同(客户端不断询问服务器“有什么新消息吗?”),WebSocket保持连接打开状态。服务器在有数据时主动向客户端发送数据。

\n\n

对PHP来说,这真是一个突破。以前,实时功能是Node.js或Python与asyncio的专属领域。但现在,PHP实时应用已成为现实。得益于Ratchet和Swoole等库,PHP可以作为长期运行的进程,处理数千个并发连接。

\n\n

这适用于哪些场景?

\n
    \n
  • 聊天和即时通讯工具;
  • \n
  • 通知系统(新订单、消息);
  • \n
  • 协同文档编辑;
  • \n
  • 在线游戏和问答;
  • \n
  • 实时监控和仪表盘。
  • \n
\n\n

准备工作:入门所需条件

\n\n

要使用PHP WebSocket服务器,我们需要:

\n
    \n
  • PHP 7.4或更高版本(最好8.x);
  • \n
  • Composer——包管理器;
  • \n
  • Ratchet库(生产环境可使用Swoole);
  • \n
  • 对OOP和命令行操作的基本理解。
  • \n
\n\n

通过Composer安装Ratchet:

\n
composer require cboden/ratchet
\n\n

安装后,您将获得vendor文件夹和composer.json文件。一切就绪,可以开始编写您的第一个PHP实时应用了。

\n\n

编写一个简单的PHP WebSocket服务器

\n\n

创建一个文件server.php。这将是我们的PHP WebSocket服务器,用于接受连接并向所有连接的客户端广播消息。

\n\n
<?php\nuse Ratchet\\Server\\IoServer;\nuse Ratchet\\Http\\HttpServer;\nuse Ratchet\\WebSocket\\WsServer;\nuse Ratchet\\MessageComponentInterface;\nuse Ratchet\\ConnectionInterface;\n\nrequire __DIR__ . '/vendor/autoload.php';\n\nclass Chat implements MessageComponentInterface {\n    protected $clients;\n\n    public function __construct() {\n        $this->clients = new \\SplObjectStorage;\n        echo "服务器已启动!\\n";\n    }\n\n    public function onOpen(ConnectionInterface $conn) {\n        $this->clients->attach($conn);\n        echo "新连接:{$conn->resourceId}\\n";\n    }\n\n    public function onMessage(ConnectionInterface $from, $msg) {\n        foreach ($this->clients as $client) {\n            if ($from !== $client) {\n                $client->send($msg);\n            }\n        }\n        echo "来自{$from->resourceId}的消息:$msg\\n";\n    }\n\n    public function onClose(ConnectionInterface $conn) {\n        $this->clients->detach($conn);\n        echo "连接已关闭:{$conn->resourceId}\\n";\n    }\n\n    public function onError(ConnectionInterface $conn, \\Exception $e) {\n        echo "错误:{$e->getMessage()}\\n";\n        $conn->close();\n    }\n}\n\n$server = IoServer::factory(\n    new HttpServer(\n        new WsServer(\n            new Chat()\n        )\n    ),\n    8080\n);\n\n$server->run();
\n\n

在控制台中启动服务器:

\n
php server.php
\n\n

完成!服务器正在监听8080端口,并准备好接受WebSocket连接。现在

博客

书籍推荐