php实现websocket
PHP 实现 WebSocket 的方法
WebSocket 是一种全双工通信协议,允许客户端和服务器之间进行实时数据传输。PHP 可以通过以下几种方式实现 WebSocket 功能:
使用 Ratchet 库
Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现,适合构建实时应用。
安装 Ratchet:
composer require cboden/ratchet
创建 WebSocket 服务器:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class MyWebSocket implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {
echo "New connection: {$conn->resourceId}\n";
}
public function onMessage(ConnectionInterface $conn, $msg) {
echo "Received message: $msg\n";
$conn->send("Echo: $msg");
}
public function onClose(ConnectionInterface $conn) {
echo "Connection closed: {$conn->resourceId}\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "Error: {$e->getMessage()}\n";
$conn->close();
}
}
$server = new \Ratchet\App('localhost', 8080);
$server->route('/ws', new MyWebSocket());
$server->run();
启动服务器:
php server.php
使用 Swoole 扩展
Swoole 是一个高性能 PHP 协程框架,内置 WebSocket 服务器支持。

安装 Swoole:
pecl install swoole
创建 WebSocket 服务器:
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
echo "Connection open: {$request->fd}\n";
});
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
echo "Received message: {$frame->data}\n";
$server->push($frame->fd, "Echo: {$frame->data}");
});
$server->on('close', function ($server, $fd) {
echo "Connection closed: $fd\n";
});
$server->start();
启动服务器:
php server.php
使用 Workerman 框架
Workerman 是另一个高性能 PHP Socket 框架,支持 WebSocket。

安装 Workerman:
composer require workerman/workerman
创建 WebSocket 服务器:
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
$ws_worker = new Worker("websocket://0.0.0.0:2346");
$ws_worker->onConnect = function ($connection) {
echo "New connection\n";
};
$ws_worker->onMessage = function ($connection, $data) {
$connection->send("Echo: $data");
};
$ws_worker->onClose = function ($connection) {
echo "Connection closed\n";
};
Worker::runAll();
启动服务器:
php server.php start
客户端连接示例
使用 JavaScript 连接 WebSocket 服务器:
const socket = new WebSocket('ws://localhost:8080/ws');
socket.onopen = function() {
console.log('Connected');
socket.send('Hello Server');
};
socket.onmessage = function(event) {
console.log('Message from server:', event.data);
};
socket.onclose = function() {
console.log('Disconnected');
};
注意事项
- Ratchet 和 Workerman 是纯 PHP 实现,适合小型项目。
- Swoole 需要安装扩展,性能更高,适合高并发场景。
- 生产环境建议使用 Nginx 反向代理 WebSocket 连接。
- WebSocket 服务器需要长期运行,可以使用 Supervisor 管理进程。






