当前位置:首页 > PHP

php实现websoc

2026-02-28 06:56:17PHP

PHP 实现 WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,允许服务器和客户端之间实时交互。PHP 可以通过以下方式实现 WebSocket 功能。

使用 Ratchet

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

安装 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';

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);

$server->run();

创建自定义的 WebSocket 处理类:

<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class Chat 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();
    }
}

启动服务器:

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 "New connection: {$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 实现简单的 WebSocket 服务器。

创建服务器脚本:

<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);

if (!$socket) {
    die("Failed to create socket: $errstr ($errno)\n");
}

while ($conn = stream_socket_accept($socket)) {
    $data = fread($conn, 1024);
    fwrite($conn, "HTTP/1.1 101 Switching Protocols\r\n");
    fwrite($conn, "Upgrade: websocket\r\n");
    fwrite($conn, "Connection: Upgrade\r\n");
    fwrite($conn, "Sec-WebSocket-Accept: " . base64_encode(sha1($data . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)) . "\r\n\r\n");

    while ($msg = fread($conn, 1024)) {
        echo "Received: $msg\n";
        fwrite($conn, "Server: $msg");
    }

    fclose($conn);
}

fclose($socket);

启动服务器:

php server.php

客户端连接

使用 JavaScript 连接 WebSocket 服务器:

php实现websoc

const socket = new WebSocket('ws://localhost:8080');

socket.onopen = function(e) {
    console.log('Connection established');
    socket.send('Hello Server!');
};

socket.onmessage = function(event) {
    console.log(`Message from server: ${event.data}`);
};

socket.onclose = function(event) {
    console.log('Connection closed');
};

socket.onerror = function(error) {
    console.log(`Error: ${error.message}`);
};

注意事项

  • 确保服务器端口未被防火墙阻止。
  • 使用 RatchetSwoole 时,确保 PHP 版本兼容。
  • 原生实现仅适用于简单场景,生产环境推荐使用成熟的库或扩展。

标签: phpwebsoc
分享给朋友:

相关文章

php实现队列

php实现队列

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

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUTO…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…