PHP中的WebSockets:无需魔法创建实时应用
\n\n您是否曾想过,为什么现代Web应用中的通知能即时到达,而聊天功能无需不断按F5刷新?秘诀在于WebSockets。是的,PHP也能实现实时功能。在本文中,我们将探讨如何让PHP与WebSockets协同工作,编写一个实时聊天和通知系统,最重要的是,无需痛苦和多余的库。
\n\n如果您习惯认为PHP是“请求-响应”模式,请准备好感到惊讶。借助PHP中的WebSockets,您可以创建完整的实时应用:从简单的聊天到多人在线游戏。而这一切,都使用您喜爱的语言。
\n\n什么是WebSockets,PHP为什么需要它们?
\n\nWebSocket是客户端与服务器之间的双向通信协议。与传统的HTTP不同(客户端不断询问服务器“有什么新消息吗?”),WebSocket保持连接打开状态。服务器在有数据时主动向客户端发送数据。
\n\n对PHP来说,这真是一个突破。以前,实时功能是Node.js或Python与asyncio的专属领域。但现在,PHP实时应用已成为现实。得益于Ratchet和Swoole等库,PHP可以作为长期运行的进程,处理数千个并发连接。
\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
通过Composer安装Ratchet:
\ncomposer require cboden/ratchet\n\n安装后,您将获得vendor文件夹和composer.json文件。一切就绪,可以开始编写您的第一个PHP实时应用了。
\n\n编写一个简单的PHP WebSocket服务器
\n\n创建一个文件server.php。这将是我们的PHP WebSocket服务器,用于接受连接并向所有连接的客户端广播消息。
<?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在控制台中启动服务器:
\nphp server.php\n\n完成!服务器正在监听8080端口,并准备好接受WebSocket连接。现在