php 实现websokect
PHP 实现 WebSocket 的方法
使用 PHP 原生 Socket 扩展
PHP 原生提供了 Socket 扩展,可以用来实现 WebSocket 服务器。以下是基本实现步骤:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);
while (true) {
$client = socket_accept($socket);
$handshake = socket_read($client, 1024);
if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $handshake, $match)) {
$key = base64_encode(sha1($match[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
$headers = "HTTP/1.1 101 Switching Protocols\r\n";
$headers .= "Upgrade: websocket\r\n";
$headers .= "Connection: Upgrade\r\n";
$headers .= "Sec-WebSocket-Accept: $key\r\n\r\n";
socket_write($client, $headers, strlen($headers));
}
// 处理消息
$data = socket_read($client, 1024);
// 解码 WebSocket 帧并处理消息
}
使用 Ratchet 库
Ratchet 是一个流行的 PHP WebSocket 库,简化了 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) {
// 新连接
}
public function onMessage(ConnectionInterface $from, $msg) {
// 处理消息
}
public function onClose(ConnectionInterface $conn) {
// 连接关闭
}
public function onError(ConnectionInterface $conn, \Exception $e) {
// 错误处理
}
}
$server = IoServer::factory(
new HttpServer(new WsServer(new MyWebSocket())),
8080
);
$server->run();
使用 Swoole 扩展
Swoole 是一个高性能 PHP 协程框架,内置 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) {
$server->push($frame->fd, "received: {$frame->data}");
});
$server->on('close', function ($server, $fd) {
echo "connection close: {$fd}\n";
});
$server->start();
WebSocket 客户端实现
PHP 也可以作为 WebSocket 客户端连接服务器:
$client = new WebSocket\Client("ws://localhost:8080");
$client->send("Hello Server!");
echo $client->receive();
$client->close();
注意事项
- WebSocket 协议需要 HTTP 升级握手,必须正确处理握手过程
- 生产环境建议使用成熟的库如 Ratchet 或 Swoole
- PHP 作为脚本语言,长时间运行的服务器需要考虑内存管理和稳定性
- WebSocket 通信需要处理帧编码/解码
- 考虑添加心跳机制保持连接活跃
以上方法提供了从底层到高级的多种实现方式,可根据项目需求选择合适的方案。







