FrankenPHP 的 Worker 模式支持常驻 PHP 进程处理 WebSocket,无需 Node 或扩展,通过 frankenphp_handle_request() 驱动、frankenphp_websocket_send() 推送,状态须存 Redis,需手动清理断连。

能,而且比 Node 更轻量、更贴近 PHP 工程习惯——FrankenPHP 原生支持 Worker 模式 + WebSocket,不需要 Node 运行时,也不依赖 npm 生态。
FrankenPHP 的 Worker 模式就是为推送而生的
传统 PHP 生命周期短(请求来、执行完、进程退),没法维持长连接;FrankenPHP 的 worker 模式让一个 PHP 脚本常驻内存,持续监听并响应 WebSocket 事件,本质就是一个轻量级服务端进程。
-
frankenphp php-server --worker ./public/chat.php启动后,chat.php只加载一次,后续所有 WebSocket 连接都在同一个 PHP 进程内处理 - 无需
fork()或守护进程管理,FrankenPHP 自动处理 worker 生命周期、信号中断和资源回收 - 对比 Swoole,它不强制要求 C 扩展;对比 Ratchet,它不依赖 ReactPHP 事件循环,直接用 FrankenPHP 提供的
frankenphp_handle_request()驱动
WebSocket 处理逻辑必须绕开 PHP 默认请求模型
你不能把 WebSocket 当成普通 HTTP 接口写——$_GET、$_POST、echo 都失效。FrankenPHP 的 worker 脚本靠读取 php://input 和调用 frankenphp_handle_request() 来收发消息。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 客户端发来的每条消息,都会触发你传入的回调函数(比如
$messageHandler),里面用file_get_contents('php://input')拿原始 JSON - 向客户端推送,得用
frankenphp_websocket_send()(需 FrankenPHP v1.0+)或自己维护连接池 + 原生 socket 写帧(v0.x 需手动实现) - 别在回调里做阻塞操作(如
sleep()、同步 DB 查询),否则整个 worker 卡住;要用frankenphp_run_in_background()或 Go 扩展异步处理
状态共享不能靠 $_SESSION 或文件,得用外部存储
Worker 是常驻进程,但多个 worker 实例之间不共享内存,单个 worker 内部也不能靠全局变量存用户列表——重启或扩容后就丢。
立即学习“PHP免费学习笔记(深入)”;
- 在线用户、房间关系、未读消息等,必须落地到 Redis(推荐)、SQLite 或 PostgreSQL
- FrankenPHP 自带
frankenphp_redis()快捷封装(v1.1+),可直接调用frankenphp_redis()->set(...) - 避免用
apcu_store():它只在当前 worker 进程有效,横向扩展时无效
真正容易被忽略的是连接保活与错误清理:WebSocket 连接断开不会自动触发 PHP 的 __destruct,你得在每次 frankenphp_handle_request() 返回前显式检查连接状态,用 frankenphp_websocket_is_closed() 判断并从 Redis 中移除失效 ID——漏掉这步,用户列表会越积越多,最后 Redis 内存爆掉。


















