PHP 8.2 实现 WebSocket 必须使用常驻进程方案(如 Swoole 或 Workerman),无法依赖 FPM;Java 21 则原生支持,通过 Jakarta EE API 在 Servlet 容器中运行,具备自动连接管理、线程安全分发和优雅资源回收能力。

PHP 8.2 实现 WebSocket 的核心路径
要在 PHP 8.2 环境中提供 WebSocket 服务,必须绕过传统 FPM 模式——因为 PHP 进程在请求结束后即销毁,无法维持长连接。你只能依赖常驻内存的扩展或框架来接管事件循环。
方法一:使用 Swoole 扩展(推荐)
第一步:确认已安装 Swoole 5.0+(兼容 PHP 8.2),且启用 swoole.enable_coroutine=1;
第二步:编写 server.php,实例化 Swoole\WebSocket\Server,绑定 on('open')、on('message')、on('close') 回调;
第三步:终端执行 php server.php 启动服务——此时进程持续运行,监听 TCP 连接,【不能通过 Apache/Nginx 直接代理该服务,必须单独暴露端口如 9501】。
方法二:使用 Workerman
无需编译扩展,纯 PHP 实现,适合共享主机或受限环境;但需手动管理连接池与心跳,【默认不自动处理 ping/pong 帧,客户端断连后服务端可能长时间保留僵尸连接】;安装 via Composer:composer require workerman/workerman,启动方式为 php start.php start -d。
Java 21 实现 WebSocket 的标准方式
Java 21 原生支持 WebSocket,无需第三方框架即可构建服务端,底层由 Jakarta EE WebSockets API(jakarta.websocket.*)驱动,运行于支持 Servlet 6.0+ 的容器中(如 Tomcat 10.1+、Jetty 12)。
立即学习“PHP免费学习笔记(深入)”;
第一步:定义一个类,用 @ServerEndpoint("/chat") 注解标记;
第二步:用 @OnOpen、@OnMessage、@OnError 方法响应生命周期事件;
第三步:将该类打包进 WAR 或 JAR,部署到容器——此时 WebSocket 端点自动注册,路径为 ws://host:port/app/chat;
第四步:客户端可直接用浏览器 new WebSocket("ws://...") 连接,无需额外协议适配。
Java 21 的实现天然具备连接状态跟踪、异常自动清理、线程安全的消息分发能力,且能与 Spring Boot 无缝集成——只需添加 spring-boot-starter-websocket 依赖,用 @MessageMapping 即可声明消息路由。
关键差异对比:连接模型与资源控制
PHP 8.2 下的 WebSocket 服务本质是单进程多协程(Swoole)或单进程多线程(Workerman),所有连接共享同一内存空间,连接数增长时内存占用线性上升,【若未限制最大连接数或未设置超时回收,易触发 OOM】。
Java 21 默认采用线程池 + NIO 通道模型,每个连接对应一个轻量级 Channel,内核态 I/O 复用效率高;连接数达万级时仍可稳定运行,GC 机制自动回收闲置会话对象,无需手动调用 session.close() 也能在超时后释放资源。
PHP 8.2 中广播消息需遍历 $server->connections 数组逐个 push();Java 21 可直接调用 session.getBasicRemote().sendText() 或使用 Session.getOpenSessions() 获取全部活跃会话,语义更清晰,错误抛出也具有一致性。



















