php 实现ws
PHP 实现 WebSocket 服务
PHP 可以通过多种方式实现 WebSocket 服务,包括使用原生 PHP、第三方库或框架。以下是几种常见方法:
使用 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 "Received message: $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();
使用 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 实现
原生 PHP 实现 WebSocket 需要手动处理握手和数据帧:
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
die("$errstr ($errno)\n");
}
while ($conn = stream_socket_accept($socket)) {
$headers = fread($conn, 1024);
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match)) {
$key = base64_encode(sha1($match[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
$response = "HTTP/1.1 101 Switching Protocols\r\n";
$response .= "Upgrade: websocket\r\n";
$response .= "Connection: Upgrade\r\n";
$response .= "Sec-WebSocket-Accept: $key\r\n\r\n";
fwrite($conn, $response);
}
while ($data = fread($conn, 1024)) {
// 处理 WebSocket 数据帧
$decoded = decodeWebSocketFrame($data);
echo "Received: $decoded\n";
$encoded = encodeWebSocketFrame("Echo: $decoded");
fwrite($conn, $encoded);
}
fclose($conn);
}
fclose($socket);
客户端连接示例
使用 JavaScript 连接上述 WebSocket 服务器:
const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => console.log('Connected');
socket.onmessage = (e) => console.log('Received:', e.data);
socket.send('Hello WebSocket');
注意事项
- WebSocket 需要 PHP 5.3 或更高版本
- 生产环境建议使用 Swoole 或 Ratchet 等成熟方案
- 原生实现复杂且性能较低,仅适合学习用途
- 确保防火墙允许 WebSocket 端口通信







