php实现websochet
PHP 实现 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时应用如聊天、游戏等。以下是使用 PHP 实现 WebSocket 的方法。
使用 ratchet/pawl 客户端库
安装 Ratchet 的 WebSocket 客户端库 pawl:
composer require ratchet/pawl
客户端连接示例:
<?php
require __DIR__ . '/vendor/autoload.php';
$loop = \React\EventLoop\Factory::create();
$connector = new \Ratchet\Client\Connector($loop);
$connector('ws://echo.websocket.org')
->then(function(\Ratchet\Client\WebSocket $conn) {
$conn->on('message', function($msg) use ($conn) {
echo "Received: {$msg}\n";
$conn->close();
});
$conn->send('Hello WebSocket!');
}, function(\Exception $e) use ($loop) {
echo "Error: {$e->getMessage()}\n";
$loop->stop();
});
$loop->run();
使用 ratchet/ratchet 创建服务端
安装 Ratchet 库:

composer require cboden/ratchet
服务端实现示例:
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
require __DIR__ . '/vendor/autoload.php';
class MyWebSocket implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
$this->clients->attach($conn);
echo "New connection: {$conn->resourceId}\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
foreach ($this->clients as $client) {
if ($client !== $from) {
$client->send($msg);
}
}
}
public function onClose(ConnectionInterface $conn) {
$this->clients->detach($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
服务端代码示例:
<?php
$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, "Server: {$frame->data}");
});
$server->on('close', function($server, $fd) {
echo "Connection closed: {$fd}\n";
});
$server->start();
原生 PHP 实现
对于简单场景,可使用 socket_create 等函数实现基础 WebSocket 握手。
握手处理示例:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while ($client = socket_accept($socket)) {
$headers = socket_read($client, 1024);
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $matches)) {
$key = base64_encode(sha1($matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
$response = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $key\r\n\r\n";
socket_write($client, $response, strlen($response));
// 后续实现消息处理
}
}
注意事项
- 生产环境推荐使用成熟的库如 Ratchet 或 Swoole,原生实现仅适合学习。
- WebSocket 需要 PHP 5.4 或更高版本。
- 注意处理连接异常和资源释放。
- 对于高性能需求,考虑使用 Swoole 或 Workerman 等异步框架。
以上方法可根据项目需求选择适合的方案实现 WebSocket 功能。






