如何正确使用HTML5 SSE结合PHP与Python实现API端点存活检测
问题根因与修复方案
核心错误原因
你遇到的连接报错是SSE实现不符合协议规范、路径配置错误、AWS EC2网络规则配置不当三类问题共同导致的,修复步骤如下:
修复步骤
1. 修正SSE响应格式
SSE协议要求单条消息必须满足两个强制规则:
- 消息内容前缀必须为
data: - 每条消息末尾必须加两个连续的换行符
\n\n
你当前直接输出检测结果不符合规范,Firefox无法识别有效响应会主动断开连接。
2. 修正所有路径配置
EventSource构造的pingServers.php路径必须和当前HTML页面同源同路径,或者填写完整绝对URL- Python脚本中的
MyJSONEndpoint.php必须填写完整的HTTP/HTTPS URL,不能使用相对路径,Python执行时无法识别Web相对路径规则
3. 配置AWS EC2安全组与运行权限
- 确认EC2安全组入站规则开放了Web服务对应的80/443端口,允许你的客户端IP访问
- 确认Web服务器运行用户有Python3执行权限、
pingServers.py文件读取权限,提前在EC2命令行手动执行python3 pingServers.py验证脚本可正常输出结果 - 若站点为HTTPS协议,SSE请求也必须走HTTPS,不能混合HTTP请求,同时按需在PHP头部加CORS头允许跨域访问
4. 按需调整长连接逻辑
如果需要持续检测API存活状态,需要在PHP中添加死循环定时执行检测,否则脚本单次执行结束后连接会自动断开,浏览器会触发重连逻辑。如果仅需单次检测,不需要使用SSE,直接用普通fetch请求调用即可,更轻量化。
修改后参考代码
pingServers.php
<?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); header('Connection: keep-alive'); // 跨域场景下添加,替换为你的前端域名 // header('Access-Control-Allow-Origin: https://your-domain.com'); // 关闭所有输出缓冲,确保消息实时推送 if (ob_get_level()) { ob_end_clean(); } ob_implicit_flush(true); // 持续检测场景保留死循环,单次检测删除即可 while (true) { // 替换为pingServers.py的绝对路径 $output = shell_exec("python3 /var/www/html/pingServers.py"); // 严格遵循SSE格式输出 echo "data: " . trim($output) . "\n\n"; flush(); // 检测间隔,单位秒,按需调整 sleep(10); } ?>
pingServers.py
#!/usr/bin/python import requests # 替换为你的API接口完整URL response = requests.post('https://your-domain.com/MyJSONEndpoint.php') if response.status_code == 200: print('OK') else: print('not OK')
前端代码新增错误监听(方便排查问题)
if(typeof(EventSource) !== "undefined") { var source = new EventSource("pingServers.php"); source.onmessage = function(event) { document.getElementById("searchDatabases").innerHTML = event.data + "<br>"; }; // 新增错误监听 source.onerror = function(e) { console.error("连接异常", e); source.close(); }; } else { console.info("Not supported browser!"); }
内容的提问来源于stack exchange,提问作者alma korte
相关产品推荐
相关产品推荐

