当前位置:首页 > PHP

php 实现websocket

2026-02-28 16:34:45PHP

PHP 实现 WebSocket 的方法

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过以下方式实现 WebSocket 功能。

使用 Ratchet 库

Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现。以下是使用 Ratchet 实现 WebSocket 服务器的步骤。

安装 Ratchet:

composer require cboden/ratchet

创建 WebSocket 服务器:

<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;

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();

运行服务器:

php server.php

使用 Swoole 扩展

Swoole 是一个高性能的 PHP 协程框架,内置 WebSocket 支持。

安装 Swoole:

pecl install swoole

创建 WebSocket 服务器:

<?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) {
    foreach ($server->connections as $fd) {
        if ($fd !== $frame->fd) {
            $server->push($fd, $frame->data);
        }
    }
});

$server->on('close', function ($server, $fd) {
    echo "Connection closed: {$fd}\n";
});

$server->start();

运行服务器:

php server.php

原生 PHP 实现

如果需要更底层的实现,可以使用 PHP 原生 Socket 函数。

创建 WebSocket 握手和处理逻辑:

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);

while (true) {
    $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\n";
        $response .= "Upgrade: websocket\r\n";
        $response .= "Connection: Upgrade\r\n";
        $response .= "Sec-WebSocket-Accept: $key\r\n\r\n";
        socket_write($client, $response, strlen($response));
    }

    // 处理 WebSocket 消息
    $data = socket_read($client, 1024);
    // 解码和编码逻辑...
}
socket_close($socket);

客户端连接示例

使用 JavaScript 连接 WebSocket 服务器:

const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => console.log('Connected');
socket.onmessage = (e) => console.log('Message:', e.data);
socket.send('Hello WebSocket');

注意事项

  • Ratchet 和 Swoole 是更推荐的方式,原生实现复杂度较高。
  • 生产环境建议使用 Swoole 以获得更好的性能。
  • 确保防火墙允许 WebSocket 使用的端口(如 8080、9501)。

php 实现websocket

标签: phpwebsocket
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session…

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…

php队列的实现

php队列的实现

PHP队列的实现方式 PHP中实现队列功能可以通过多种方式,根据需求选择适合的方案: 使用数组实现基础队列 PHP数组本身支持队列操作,利用array_push和array_shift函数:…