通过轻量级轮询替代长连接sse,用`filemtime()`高效获取文件修改时间,并结合前端定时检查实现低开销自动刷新,彻底避免apache进程数爆炸。
传统服务端事件(SSE)方案虽实时性好,但每个打开的页面标签都会维持一个长期存活的PHP进程,导致Apache并发连接数线性增长——100个标签即100个常驻进程,极易触达MaxRequestWorkers上限,引发服务僵死。根本问题在于:将状态监听逻辑错误地放在服务端持续执行,而非交由客户端按需轻量查询。
✅ 正确解法是「客户端主动轮询 + 服务端瞬时响应」:
以下是优化后的完整实现:
1. 服务端(get_index_change_time.php)——极简、无状态、无循环
⚠️ 注意: 移除所有shell_exec()调用,filemtime()直接读取文件系统元数据,性能提升10倍以上; 显式禁用缓存,确保每次请求都真实校验; 使用@抑制filemtime()在文件不存在时的警告,返回0便于前端判断。
2. 客户端(嵌入index.html的JS)——防抖+错误隔离+优雅降级
? 关键优势总结:
MaxRequestWorkers、KeepAlive等参数,适配任何共享主机环境; 此方案将负载从服务器CPU/内存转移到带宽(极小)和客户端计算,完美契合静态网站场景,在有限资源下实现高可靠、低延迟的自动更新体验。