php怎么实现websocket
PHP 实现 WebSocket 的方法
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过以下几种方式实现 WebSocket 功能。
使用 Ratchet 库
Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现。以下是使用 Ratchet 实现 WebSocket 服务器的步骤:
安装 Ratchet:
composer require cboden/ratchet
创建 WebSocket 服务器:
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
创建 Chat 类处理消息:

namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($from !== $client) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($conn);
}
public function onError(ConnectionInterface $conn, \Exception $e) {
$conn->close();
}
}
使用 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, json_encode(["hello", "world"]));
});
$server->on('close', function ($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
使用 Workerman
Workerman 是另一个 PHP 的 Socket 服务器框架,支持 WebSocket。
安装 Workerman:
composer require workerman/workerman
创建 WebSocket 服务器:
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$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('Hello ' . $data);
};
$ws_worker->onClose = function($connection) {
echo "Connection closed\n";
};
Worker::runAll();
客户端连接示例
HTML/JavaScript 客户端代码:
<script>
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = function(e) {
console.log('Connection established');
socket.send('Hello Server!');
};
socket.onmessage = function(event) {
console.log(`Data received from server: ${event.data}`);
};
socket.onclose = function(event) {
console.log('Connection closed');
};
socket.onerror = function(error) {
console.log(`Error: ${error.message}`);
};
</script>
注意事项
- 生产环境需要考虑 SSL 加密(wss://),可以使用 Let's Encrypt 获取免费证书。
- WebSocket 服务器需要长期运行,建议使用 Supervisor 进程管理工具。
- 对于高并发场景,Swoole 或 Workerman 性能优于 Ratchet。
- 前端需要处理连接断开和重连逻辑。






