PHP中的Server-Sent Events:如何从服务器实时发送数据

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

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

开始课程

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\n

SSE(Server-Sent Events)是一种HTML5标准,允许服务器通过单个HTTP连接向客户端发送数据。与双向通信的WebSockets不同,SSE是单向通道:数据仅从服务器流向客户端。但这也正是其主要优势所在:实现非常简单,既不需要额外的库,也不需要专门的服务器。

\n\n

server-sent events php 的应用场景有哪些?

\n
    \n
  • 实时新闻推送和通知
  • \n
  • 服务器和日志监控
  • \n
  • 汇率、股票报价
  • \n
  • 长时间操作进度指示器(文件上传、视频处理)
  • \n
  • 聊天机器人和警报系统
  • \n
\n\n

与传统的轮询(客户端每隔N秒请求服务器)不同,SSE PHP 建立了一个持久连接,无需重复握手和头部信息。这节省了流量和CPU资源。

\n\n

SSE的工作原理:协议与头部信息

\n\n

SSE基于一个带有特殊内容类型的普通HTTP响应。服务器使用关键字 event、data、id 和 retry 以文本格式发送数据。客户端接收数据流并实时处理事件。

\n\n

基本协议如下所示:

\n
Content-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: 你好,世界\n\ndata: {"message": "这是JSON"}
\n\n

每条消息以 data: 开头,后跟文本内容。如果需要发送多行,只需连续写多个 data:。空行 \\n\\n 表示消息结束。

\n\n

编写第一个PHP SSE脚本

\n\n

让我们创建一个简单的脚本,每隔2秒发送一次当前时间。这是一个经典示例,能立即展示实时PHP的神奇之处。

\n\n

文件 sse.php:

\n
<?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()。如果客户端关闭了标签页,脚本将终止,不会加重服务器负担。

\n\n

现在编写JavaScript客户端部分:

\n
<!DOCTYPE html>\n<html>\n<head>\n    <title>SSE演示 PHP</title>\n</head>\n<body>\n    <h2>来自服务器的当前时间:</h2                

博客

书籍推荐