当前位置:首页 > PHP

php 实现ws

2026-01-30 00:13:06PHP

PHP 实现 WebSocket 服务

PHP 可以通过多种方式实现 WebSocket 服务,包括使用原生 PHP、第三方库或框架。以下是几种常见方法:

使用 Ratchet 库

Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现。安装 Ratchet 可以通过 Composer:

composer require cboden/ratchet

创建一个简单的 WebSocket 服务器:

php 实现ws

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 服务器:

php 实现ws

$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 端口通信

标签: phpws
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php队列的实现

php队列的实现

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

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…