PHP中的Server-Sent Events:当服务器主动推送数据到浏览器
\n\n您是否曾想过Twitter的新闻推送、交易所的汇率或即时通讯软件的通知是如何工作的?没错——数据会自动到达,无需刷新页面,也无需无休止的Ajax请求。大多数开发者会立刻想到WebSockets,但还有另一种更简单、更优雅的方式——Server-Sent Events (SSE)。
\n\n在本文中,我们将从零开始讲解如何在PHP中实现Server-Sent Events。您将学习如何实时从服务器发送数据,而无需使用复杂的库来加重基础设施负担。无需Node.js,无需消息队列——只需纯PHP和HTML5。
\n\n什么是Server-Sent Events,为什么需要它们?
\n\nSSE(Server-Sent Events)是一种HTML5标准,允许服务器通过单个HTTP连接向客户端发送数据。与双向通信的WebSockets不同,SSE是单向通道:数据仅从服务器流向客户端。但这也正是其主要优势所在:实现非常简单,既不需要额外的库,也不需要专门的服务器。
\n\nserver-sent events php 的应用场景有哪些?
\n- \n
- 实时新闻推送和通知 \n
- 服务器和日志监控 \n
- 汇率、股票报价 \n
- 长时间操作进度指示器(文件上传、视频处理) \n
- 聊天机器人和警报系统 \n
与传统的轮询(客户端每隔N秒请求服务器)不同,SSE PHP 建立了一个持久连接,无需重复握手和头部信息。这节省了流量和CPU资源。
\n\nSSE的工作原理:协议与头部信息
\n\nSSE基于一个带有特殊内容类型的普通HTTP响应。服务器使用关键字 event、data、id 和 retry 以文本格式发送数据。客户端接收数据流并实时处理事件。
基本协议如下所示:
\nContent-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: 你好,世界\n\ndata: {"message": "这是JSON"}\n\n每条消息以 data: 开头,后跟文本内容。如果需要发送多行,只需连续写多个 data:。空行 \\n\\n 表示消息结束。
编写第一个PHP SSE脚本
\n\n让我们创建一个简单的脚本,每隔2秒发送一次当前时间。这是一个经典示例,能立即展示实时PHP的神奇之处。
\n\n文件 sse.php:
<?php\n// 关闭输出缓冲\nob_implicit_flush(true);\nob_end_flush();\n\n// 设置SSE头部信息\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache');\nheader('Connection: keep-alive');\nheader('X-Accel-Buffering: no'); // 针对Nginx\n\nwhile (true) {\n // 构建数据\n $data = [\n 'time' => date('H:i:s'),\n 'timestamp' => time()\n ];\n \n // 发送事件\n echo "data: " . json_encode($data) . "\\n\\n";\n \n // 检查客户端是否已断开连接\n if (connection_aborted()) {\n break;\n }\n \n // 暂停2秒\n sleep(2);\n}\n?>\n\n请注意:我们使用了无限循环 while(true),但必须检查 connection_aborted()。如果客户端关闭了标签页,脚本将终止,不会加重服务器负担。
现在编写JavaScript客户端部分:
\n<!DOCTYPE html>\n<html>\n<head>\n <title>SSE演示 PHP</title>\n</head>\n<body>\n <h2>来自服务器的当前时间:</h2