关于PHP SSE改POST捕获请求及Python Requests传参网页显示的技术问询
问题解答
1. 替换成POST判断的思路完全走不通
原代码里的while(true)是SSE的核心——维持长连接,持续给浏览器推送内容。如果换成if($_SERVER['REQUEST_METHOD']==='POST'),会直接废掉原有的SSE功能:
- 浏览器用
EventSource发起的是GET请求,根本触发不了这个POST分支,网页连基础的推送都收不到; - POST请求是一次性的HTTP请求,处理完就关闭连接,完全不符合SSE“长连接持续推送”的逻辑,更不可能“捕获所有POST请求”并展示到网页——每个POST请求都是独立的,和网页的SSE连接半毛钱关系都没有。
2. Python requests发POST没法直接显示在网页
用Python的requests发POST请求,服务器处理这个请求时,就算输出了SSE格式的数据,也只会把响应返回给Python的请求会话,和浏览器的EventSource是两个完全独立的HTTP会话,网页根本收不到这部分内容。
正确的实现思路
要是想实现“接收外部POST请求,把内容推送给所有打开网页的用户”,得这么改:
- 保留SSE的长连接循环(
while(true)),让服务器一直盯着要推送的内容; - 整个临时存储(比如本地文本文件、Redis缓存),用来存POST请求的内容;
- 在SSE的循环里,定期读这个存储的内容,一旦有新内容就推给浏览器;
- 单独写个处理POST请求的接口,把收到的内容写到临时存储里。
给个简单的示例:
SSE推送文件(sse.php)
<?php header("Cache-Control: no-store"); header("Content-Type: text/event-stream"); // 跨域的话加上下面这句 // header("Access-Control-Allow-Origin: *"); $storageFile = 'sse_temp.txt'; $lastContent = ''; while(true){ if(file_exists($storageFile)){ $currentContent = file_get_contents($storageFile); if($currentContent !== $lastContent){ echo "event: new_post\n"; // 转成JSON避免格式问题 echo "data: " . json_encode($currentContent) . "\n\n"; ob_end_flush(); flush(); $lastContent = $currentContent; } } sleep(1); } ?>
POST接收接口(receive_post.php)
<?php $storageFile = 'sse_temp.txt'; if($_SERVER['REQUEST_METHOD'] === 'POST'){ // 获取POST原始内容,支持表单、JSON等格式 $postData = file_get_contents('php://input'); file_put_contents($storageFile, $postData); echo "内容已接收"; } ?>
前端HTML修改
<!doctype html> <html lang="zh-CN"> <body> <h1>PHP SSE 接收POST推送演示</h1> <div id="output"></div> <script> const eventSource = new EventSource("sse.php"); eventSource.addEventListener("new_post", (event) => { const output = document.getElementById("output"); const item = document.createElement('div'); item.style.margin = '8px 0'; item.innerHTML = `<strong>收到POST内容:</strong>${JSON.parse(event.data)}`; output.appendChild(item); }); </script> </body> </html>
Python发送POST请求示例
import requests # 替换成你的实际域名 url = 'http://localhost/receive_post.php' # 可以发表单数据,也可以发JSON data = {"msg": "这是Python发送的POST消息"} response = requests.post(url, json=data) print(response.text)
这样操作后,Python发的POST内容会被存到临时文件里,SSE服务器循环检测到新内容,就会推送给所有打开网页的用户,刚好满足你的需求。
内容的提问来源于stack exchange,提问作者hoho715
相关产品推荐
相关产品推荐

