当前位置:首页 > PHP

php实现websoc

2026-02-14 07:51:25PHP

PHP 实现 WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,常用于实时应用程序。PHP 可以通过以下方法实现 WebSocket 功能。

使用 Ratchet 库

Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现,适合构建实时应用。

安装 Ratchet:

composer require cboden/ratchet

创建 WebSocket 服务器:

<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;

require dirname(__DIR__) . '/vendor/autoload.php';

class Chat implements \Ratchet\MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(\Ratchet\ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection: {$conn->resourceId}\n";
    }

    public function onMessage(\Ratchet\ConnectionInterface $from, $msg) {
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }

    public function onClose(\Ratchet\ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection closed: {$conn->resourceId}\n";
    }

    public function onError(\Ratchet\ConnectionInterface $conn, \Exception $e) {
        echo "Error: {$e->getMessage()}\n";
        $conn->close();
    }
}

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    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

手动实现 WebSocket 握手

如果不想依赖第三方库,可以手动实现 WebSocket 握手协议。

示例代码:

<?php
$host = '0.0.0.0';
$port = 8080;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, $host, $port);
socket_listen($socket);

$clients = [$socket];

while (true) {
    $read = $clients;
    $write = $except = null;
    socket_select($read, $write, $except, 0);

    if (in_array($socket, $read)) {
        $newClient = socket_accept($socket);
        $header = socket_read($newClient, 1024);
        if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $header, $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($newClient, $response, strlen($response));
            $clients[] = $newClient;
        }
        $key = array_search($socket, $read);
        unset($read[$key]);
    }

    foreach ($read as $client) {
        $data = socket_read($client, 1024);
        if ($data === false) {
            $key = array_search($client, $clients);
            unset($clients[$key]);
            continue;
        }
        foreach ($clients as $sendClient) {
            if ($sendClient != $socket && $sendClient != $client) {
                socket_write($sendClient, $data, strlen($data));
            }
        }
    }
}

socket_close($socket);

WebSocket 客户端连接

使用 JavaScript 连接 WebSocket 服务器:

const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
    console.log('Connected');
    socket.send('Hello Server');
};
socket.onmessage = (event) => {
    console.log('Message from server:', event.data);
};

注意事项

  • WebSocket 服务器需要长期运行,建议使用 Supervisor 或 systemd 管理进程。

  • 生产环境建议使用 Nginx 反向代理 WebSocket,配置如下:

    location /ws {
      proxy_pass http://localhost:8080;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_set_header Host $host;
    }
  • 对于高并发场景,Swoole 性能优于 Ratchet,但需要安装扩展。

  • 手动实现 WebSocket 仅适合学习,生产环境建议使用成熟库。

php实现websoc

标签: phpwebsoc
分享给朋友:

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (H…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searc…

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…