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

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

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

开始课程

WebSocket在PHP中:如何让网站实现实时通信

\n\n

想象一下一个普通的网站。你点击了一个按钮——然后等待页面刷新。这就像寄信:你把信扔进邮箱,然后希望它能到达。现在想象一下你在打电话——你能立刻听到对方的声音。WebSockets 就是网络的“电话”。是的,在PHP上也能实现。

\n\n

许多人认为WebSocket是Node.js或Python的专属。但PHP,尽管最初是为“拼接”HTML而创建,早已超越了它的摇篮。今天,我们将探讨如何构建一个基于PHP的实时应用——无论是聊天、通知流还是实时分析。而且无需任何拐杖。

\n\n

如果你曾尝试通过长轮询实现PHP实时聊天,并看到服务器在每秒1000个请求下崩溃——这篇文章就是为你准备的。WebSockets 改变了游戏规则。

\n\n

什么是WebSocket,为什么PHP能与它协作?

\n\n

WebSocket是浏览器和服务器之间的双向通信通道。与HTTP不同(客户端总是发起请求),这里服务器可以主动向客户端发送数据。这提供了真正的实时,而非模拟。

\n\n

与长轮询(客户端不断询问“有什么新消息吗?”)的关键区别在于,WebSocket连接保持打开状态。一旦建立连接,就可以不间断地通信。这极大地节省了流量和资源。

\n\n

PHP作为一种语言,顺序执行脚本。但这并不妨碍它成为一个优秀的WebSocket服务器。秘诀在于架构:我们不通过Web服务器(Apache/Nginx)为每个连接运行PHP,而是将其作为独立的守护进程使用。这时,库就登场了。

\n\n

PHP WebSocket库:如何选择?

\n\n

有两个最流行的库,都值得关注:

\n\n
    \n
  • Ratchet — PHP WebSocket的鼻祖。可靠、经过验证,但略显“老派”。它基于ReactPHP使用事件驱动模型。非常适合简单的聊天和通知。
  • \n
  • Swoole — 猛兽。这不仅仅是一个库,而是一个重写PHP核心的引擎。它提供异步、协程和接近Go的性能。但需要在服务器上安装扩展。
  • \n
\n\n

对于初次接触,我推荐Ratchet——它更容易上手,无需修改php.ini。此外,它与我们今天也会涉及的ReactPHP配合得很好。

\n\n

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

\n\n

让我们创建一个基本的回声服务器。它将接收客户端的消息并将其发送回去。这是WebSocket的经典“Hello, World”。

\n\n

首先,通过Composer安装Ratchet。在项目根目录打开终端:

\n\n
composer require cboden/ratchet
\n\n

现在创建文件server.php:

\n\n
<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Ratchet\\MessageComponentInterface;\nuse Ratchet\\ConnectionInterface;\n\nclass EchoServer implements MessageComponentInterface {\n    public function onOpen(ConnectionInterface $conn) {\n        echo "新连接: {$conn->resourceId}\\n";\n    }\n\n    public function onMessage(ConnectionInterface $from, $msg) {\n        echo "收到: {$msg}\\n";\n        $from->send("回声: {$msg}");\n    }\n\n    public function onClose(ConnectionInterface $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// 启动服务器\nuse Ratchet\\Server\\IoServer;\nuse Ratchet\\Http\\HttpServer;\nuse Ratchet\\WebSocket\\WsServer;\n\                

博客

书籍推荐