php实现websocket
PHP 实现 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过一些库或扩展实现 WebSocket 功能。以下是几种常见的方法:
使用 Ratchet 库
Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现。安装 Ratchet 可以通过 Composer:
composer require cboden/ratchet
创建一个简单的 WebSocket 服务器:
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
class MyWebSocket implements MessageComponentInterface {
public function onOpen(ConnectionInterface $conn) {
echo "New connection: {$conn->resourceId}\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
echo "Message received: {$msg}\n";
$from->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 = IoServer::factory(
new HttpServer(
new WsServer(
new MyWebSocket()
)
),
8080
);
$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 "Message received: {$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;
$worker = new Worker("websocket://0.0.0.0:2345");
$worker->onConnect = function (TcpConnection $connection) {
echo "New connection: {$connection->id}\n";
};
$worker->onMessage = function (TcpConnection $connection, $data) {
echo "Message received: {$data}\n";
$connection->send("Echo: {$data}");
};
$worker->onClose = function (TcpConnection $connection) {
echo "Connection closed: {$connection->id}\n";
};
Worker::runAll();
运行服务器:

php server.php start
注意事项
- 确保服务器环境支持长连接,避免超时断开。
- WebSocket 服务器需要运行在命令行或后台进程中,不能通过普通的 PHP 脚本直接访问。
- 生产环境中建议使用 Nginx 或 Apache 反向代理 WebSocket 服务,以提高性能和安全性。
以上方法可以根据项目需求选择适合的方案。Ratchet 适合简单的 WebSocket 应用,Swoole 和 Workerman 适合高性能场景。






