You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:15:29