FrankenPHP 1.5 不原生支持 WebSocket,需通过反向代理将 /ws 路径转发至 Swoole 等独立 WebSocket 服务,并在 Caddyfile 中透传 Upgrade/Connection 头以完成 HTTP 升级。

FrankenPHP 1.5 本身不原生支持 WebSocket 服务。
它是一个基于 PHP 的现代应用服务器(构建在 Caddy 和 PHP-SAPI 基础上),主打同步/异步 HTTP 请求处理、Swoole 兼容性、以及对 PHP 应用的零配置部署。但它的核心定位是 HTTP(S) 服务器 + PHP 运行时,不是 WebSocket 网关或长连接服务器。
所以直接用 FrankenPHP 1.5 启动一个标准 WebSocket 服务(如 wss:// 或 ws://)是不可能的——它没有内置 WebSocket 握手解析、帧处理、连接管理等能力。
那怎么“用 FrankenPHP 1.5 实现 WebSocket 服务”?
实际可行的方案是:把 FrankenPHP 当作 HTTP 网关 + 静态/PHP 后端,而将 WebSocket 逻辑交给另一个专用进程(如 Swoole、Workerman、Ratchet 或 Node.js),再通过反向代理或共存方式协同工作。
推荐组合方案(FrankenPHP 1.5 + Swoole)
这是最贴近“用 FrankenPHP 实现 WebSocket”的实用路径,尤其适合已有 PHP 项目想扩展实时功能:
- FrankenPHP 1.5 负责:托管前端静态资源(HTML/JS/CSS)、处理普通 API 请求、提供 HTTPS 终止和路由分发
-
Swoole 作为独立 WebSocket 服务:监听本地端口(如
127.0.0.1:9502),实现握手、消息收发、广播、连接管理等 -
Caddy(FrankenPHP 内置)反向代理 WebSocket:在 FrankenPHP 的
Caddyfile中配置升级规则,把/ws路径流量转发到 Swoole 进程
示例 Caddyfile 片段(FrankenPHP 自带 Caddy,可直接编辑):
your-app.test {
# 正常 PHP 请求走 FrankenPHP
php_backend
<pre class="brush:php;toolbar:false;"># WebSocket 路径代理到本地 Swoole
route /ws* {
reverse_proxy 127.0.0.1:9502 {
transport http {
keepalive 30s
}
header_up Upgrade {http.upgrade}
header_up Connection {http.connection}
}
}}
快速启动一个 Swoole WebSocket 服务(PHP)
新建 ws-server.php:
<?php use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
<p>$server = new Server('127.0.0.1', 9502);<p>$server->on('start', function ($server) {
echo "WebSocket server started at ws://127.0.0.1:9502\n";
});</p><p>$server->on('open', function (Server $server, Request $request) {
echo "Connection opened: {$request->fd}\n";
});</p><p>$server->on('message', function (Server $server, Frame $frame) {
$server->push($frame->fd, "Echo: {$frame->data}");
});</p><p>$server->on('close', function ($server, $fd) {
echo "Connection closed: {$fd}\n";
});</p><p>$server->start();</p>
安装依赖并运行:
-
composer require swoole/ide-helper(确保 Swoole 扩展已启用) -
php ws-server.php启动服务 - 前端 JS 连接:
const ws = new WebSocket('wss://your-app.test/ws');(注意:HTTPS 域名需配好证书,FrankenPHP 自动提供)
注意事项
- FrankenPHP 1.5 不支持 WebSocket over HTTP/2;必须使用 HTTP/1.1 升级机制(
Upgrade: websocket) - 确保 Caddy 反向代理中透传
Upgrade和Connection头,否则握手失败 - 生产环境建议用
wss://,FrankenPHP 自动处理 TLS,Swoole 侧无需重复加密 - 不要尝试用
php -S或 FrankenPHP 内置 PHP-FPM 模式跑 WebSocket —— 它们是阻塞/短生命周期模型,无法维持长连接
本质上,FrankenPHP 1.5 是你的“智能网关+PHP引擎”,WebSocket 是另一层“实时通信引擎”。两者分工协作,才是当前最稳定、可维护的落地方式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











