您还在手动刷新页面?是时候进入实时时代了
\n\n想象一下:您打开了一个在线交易所,而美元汇率却死死地定格不动。您按 F5,再按——它还是不变。熟悉吗?现在再想象一下,汇率自动更新,就像电影里一样——流畅且无延迟。这不是魔法,这是实时技术。正是它们将静态网站变成了一个活生生的有机体:聊天、通知、实时更新的仪表盘。
\n\n今天,我们将剖析支撑整个实时网络的四大基石:Long-Polling、WebSockets、Server-Sent Events (SSE) 和 Comet。我将展示它们“引擎盖下”的工作原理,并提供现成的 PHP 代码,您可以立即使用。开始吧!
\n\n本文为教育门户网站 pythonlib.ru 撰写——在这里,我们将复杂的概念转化为易于理解的工具。
\n\n快速概览:这些术语背后隐藏着什么?
\n\n当您打开一个普通页面时,浏览器发出请求,服务器响应——连接关闭。就这么简单。但是,如果服务器想主动“敲门”向您发送新数据呢?这时就需要一些特殊技巧了。
\n\n- \n
- Long-Polling(长轮询)——老当益壮。客户端“挂”在服务器上,等待服务器愿意响应。 \n
- WebSockets(WebSocket)——近年来的趋势。一个全双工通道,就像电话线一样。 \n
- Server-Sent Events (SSE)——从服务器到客户端的单向广播。非常适合新闻推送和行情报价。 \n
- Comet——服务器无需额外请求即可“推送”数据给客户端的技术总称。Long-Polling 和 SSE 是 Comet 的特例。 \n
技术 #1:Long-Polling——实时技术的鼻祖
\n\nLong-Polling 是指客户端对服务器说:“我会等,多久都行,只要数据一出现就回复我。”客户端打开一个连接并保持打开状态,直到服务器发送响应。收到响应后,客户端立即创建一个新请求。这样就形成了一个无限循环。
\n\n优点:可在任何主机上运行,无需额外库,所有浏览器都支持。
\n缺点:大量多余的头部信息,服务器负载高,客户端数量多时会有延迟。
\n\nPHP 示例 (Long-Polling)
\n\n<?php\n// long_polling.php\nheader('Content-Type: text/plain; charset=utf-8');\nheader('Cache-Control: no-cache');\n\n$timeout = 30; // 最多等待 30 秒\n$start = time();\n\n// 模拟新数据的出现\n$data = getNewDataFromDB(); // 您的数据获取函数\n\nwhile (empty($data)) {\n if ((time() - $start) > $timeout) {\n echo json_encode(['status' => 'timeout', 'data' => null]);\n flush();\n exit;\n }\n usleep(500000); // 休眠 0.5 秒\n $data = getNewDataFromDB();\n}\n\necho json_encode(['status' => 'ok', 'data' => $data]);\nflush();\n?>\n\n在客户端 (JavaScript) 看起来是这样的:
\n\nfunction longPoll() {\n fetch('/long_polling.php')\n .then(response => response.json())\n .then(data => {\n if (data.status === 'ok') {\n console.log('新数据:', data.data);\n // 更新界面\n }\n longPoll(); // 立即创建新请求\n })\n .catch(error => {\n console.error('错误:', error);\n setTimeout(longPoll, 1000); // 一秒钟后重新连接\n });\n}\nlongPoll();\n\n看到了吗?客户端挂起,等待,接收数据——然后再次挂起。这就是纯正的 PHP Long-Polling。
\n\n技术 #2:WebSockets——双向高速公路
\n\nWebSockets