很多 PHP 开发者都有过这样的困扰:想做个在线聊天室、实时客服或者弹幕推送,却发现主流方案都是 Node.js + Socket.IO,自己还要额外学一门语言、搭一套环境,成本实在太高。
好在有 PHPSocket.IO,它是由 Workerman 作者 walkor 开发的 PHP 版 Socket.IO 服务端,让咱们只用 PHP就能快速搭建稳定、兼容、低延迟的实时应用,前端代码几乎不用改动。

简单说,它就是Socket.IO 的 PHP 实现,完全兼容 Socket.IO 客户端协议(支持 v1.3.0 ~ v2.x),API 风格也高度一致,on、emit、to、join 这些常用方法和 JS 版一模一样,前端同学几乎零成本对接。
它基于 Workerman 构建,天生自带异步非阻塞、多进程高性能的优势,同时又比原生 Workerman 更友好,自带完善的兼容降级方案,不支持WebSocket 的环境会自动切换到长轮询、JSONP甚至 Flash Socket,对开发者完全透明。
与 Workerman 的区别PHPSocket.IO 是基于 Workerman 开发的,继承了所有性能优点,但更专注于实时通信,兼容策略更完善;而 Workerman 是更底层的通用服务器,支持 TCP、UDP、HTTP 等更多协议。
与 Node.js Socket.IO 的区别
安装非常简单,直接 Composer 一键引入:
composer require workerman/phpsocket.io下面是一套完整可用的服务端示例,包含用户登录、房间绑定、断开清理、外加 HTTP 推送接口:
<?phpnamespaceapp\http\controller;usePHPSocketIO\SocketIO;usethink\facade\Log;useWorkerman\Worker;classServer{publicfunctionserver(){ $uidConnectionMap = [];// 监听 2120 端口 $sender_io = new SocketIO(2120);// 客户端连接 $sender_io->on('connection', function($socket){// 登录事件 $socket->on('login', function($uid)use($socket){global $uidConnectionMap;if (isset($socket->uid)) return; $uid = (string)$uid;if (!isset($uidConnectionMap[$uid])) { $uidConnectionMap[$uid] = 0; } $uidConnectionMap[$uid]++; $socket->join($uid); $socket->uid = $uid; });// 断开连接 $socket->on('disconnect', function()use($socket){global $uidConnectionMap;if (!isset($socket->uid)) return;if (--$uidConnectionMap[$socket->uid] <= 0) {unset($uidConnectionMap[$socket->uid]); } }); });// 启动内部 HTTP 推送接口 $sender_io->on('workerStart', function()use($sender_io){ $inner_http_worker = new Worker('http://0.0.0.0:2121'); $inner_http_worker->onMessage = function($http_connection, $data)use($sender_io){global $uidConnectionMap; $to = $data['post']['to'] ?? ''; $content = htmlspecialchars($data['post']['content'] ?? '');if ($to) { $sender_io->to($to)->emit('new_msg', $content); } else { $sender_io->emit('new_msg', $content); }if ($to && !isset($uidConnectionMap[$to])) { $http_connection->send('offline'); } else { $http_connection->send('ok'); } }; $inner_http_worker->listen(); }); Worker::runAll(); }}后台守护进程启动:
php web_msg.php start -d启动成功后,会显示类似这样的状态:
Workerman[web_msg.php] start in DAEMON modeWorkerman version: 5.1.2 PHP version: 8.2.19proto user worker listen processes statustcp www PHPSocketIO socketIO://0.0.0.0:2120 1 [OK]项目里直接调用这个函数,就能向指定用户推送实时消息:
functionsend_web_msg($to_uid = 1, string $content = ''): string|array{if (empty($content)) {return ['error_code' => 404, 'reason' => '缺少推送内容']; } $url = 'http://127.0.0.1:2121/'; $data = ['type' => 'publish','content' => $content,'to' => (string)$to_uid, ]; $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($data), CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, ]); $response = curl_exec($ch); curl_close($ch);return trim($response) ?: 'ok';}直接引入客户端,连接、登录、收消息一步到位:
<scriptsrc="https://cdn.jsdelivr.net/npm/socket.io-client@4.8.1/dist/socket.io.min.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/notifyjs@3.0.0/dist/notify.min.js"></script><script>$(function () {const uid = "1";const socket = io("https://www.tinywan.com", {path: "/socket.io",transports: ["websocket", "polling"],reconnection: true }); socket.on("connect", function () { socket.emit("login", uid); });// 接收消息 socket.on("new_msg", function (msg) { $("#notice-content").html(`系统提示:${msg}`); $(".notification.sticky").notify(); });});</script>PHPSocket.IO 真正解决了 PHP 开发者做实时应用的痛点:不用学 Node、不用搭额外服务、API 熟悉、部署简单、兼容性强。中小型项目用它做实时推送,稳定、省心、成本极低,堪称 PHP 实时开发的一把利器。