跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
PHP WebSocket
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= PHP WebSocket = '''WebSocket''' 是一种在单个TCP连接上进行全双工通信的协议,允许服务器和客户端之间实时交换数据。在PHP中,WebSocket通常用于构建实时应用程序,如聊天系统、在线游戏或股票行情推送等。 == 简介 == 传统的HTTP协议是无状态的,每次请求都需要建立新的连接。而WebSocket通过一次握手建立持久连接,实现低延迟的双向通信。PHP可以通过扩展库(如Ratchet或Swoole)实现WebSocket服务器。 === 核心特点 === * '''全双工通信''':客户端和服务器可以同时发送和接收数据。 * '''低延迟''':避免HTTP的重复握手开销。 * '''轻量级''':数据帧头仅2-10字节。 == 工作原理 == WebSocket通信分为两个阶段: 1. '''握手阶段''':客户端通过HTTP Upgrade头请求切换到WebSocket协议。 2. '''数据传输阶段''':通过帧(Frame)格式交换数据。 <mermaid> sequenceDiagram Client->>Server: HTTP Upgrade请求 (Connection: Upgrade) Server->>Client: 101 Switching Protocols Note over Client,Server: WebSocket连接建立 Client->>Server: 发送数据帧 Server->>Client: 返回数据帧 </mermaid> == PHP实现方式 == === 使用Ratchet库 === Ratchet是PHP的WebSocket库,基于ReactPHP事件循环。 <syntaxhighlight lang="php"> // 安装Ratchet: composer require cboden/ratchet use Ratchet\MessageComponentInterface; use Ratchet\ConnectionInterface; use Ratchet\Server\IoServer; use Ratchet\Http\HttpServer; use Ratchet\WebSocket\WsServer; class MyChat implements MessageComponentInterface { protected $clients; public function __construct() { $this->clients = new \SplObjectStorage; } public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "New connection! ({$conn->resourceId})\n"; } public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($client !== $from) { $client->send($msg); } } } public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Connection {$conn->resourceId} disconnected\n"; } public function onError(ConnectionInterface $conn, \Exception $e) { echo "Error: {$e->getMessage()}\n"; $conn->close(); } } $server = IoServer::factory( new HttpServer(new WsServer(new MyChat())), 8080 ); $server->run(); </syntaxhighlight> '''输出示例:''' <pre> New connection! (1) New connection! (2) Connection 1 disconnected </pre> === 使用Swoole扩展 === Swoole提供了更高性能的WebSocket实现: <syntaxhighlight lang="php"> $server = new Swoole\WebSocket\Server("0.0.0.0", 9501); $server->on('open', function (Swoole\WebSocket\Server $server, $request) { echo "connection open: {$request->fd}\n"; }); $server->on('message', function ($server, $frame) { foreach ($server->connections as $fd) { if ($fd != $frame->fd) { $server->push($fd, $frame->data); } } }); $server->on('close', function ($server, $fd) { echo "connection close: {$fd}\n"; }); $server->start(); </syntaxhighlight> == 握手过程详解 == WebSocket握手使用HTTP头交换密钥: <math> \text{Sec-WebSocket-Accept} = \text{base64}(\text{sha1}(\text{Sec-WebSocket-Key} + \text{258EAFA5-E914-47DA-95CA-C5AB0DC85B11})) </math> == 实际应用案例 == === 实时聊天系统 === 1. 用户A发送消息到WebSocket服务器 2. 服务器广播给所有连接的客户端 3. 用户B实时接收消息 === 股票行情推送 === 1. 服务器从数据源获取最新价格 2. 通过WebSocket推送至所有订阅的客户端 3. 网页无需刷新即可更新数据 == 性能优化 == * '''连接池管理''':复用TCP连接 * '''二进制协议''':使用opcode=2减少数据量 * '''心跳检测''':定期PING/PONG保持连接 == 安全考虑 == * 实施'''wss://'''(WebSocket Secure) * 验证'''Origin'''头防止CSRF攻击 * 限制帧大小防止内存耗尽 == 常见问题 == '''Q: PHP适合高并发WebSocket吗?''' A: 原生PHP需配合扩展(如Swoole),纯PHP进程模型效率较低。 '''Q: 如何检测连接断开?''' A: 通过onClose回调或心跳超时机制。 == 参见 == * RFC 6455 - WebSocket协议标准 * PHP官方文档中的socket扩展 * HTML5 WebSocket API规范 == 进阶阅读 == * WebSocket协议帧格式解析 * 负载均衡下的WebSocket集群 * 与HTTP/2的性能对比分析 [[Category:PHP网络编程]] [[Category:WebSocket技术]] [[Category:编程语言]] [[Category:PHP]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)