当前位置:首页 > PHP

php实现websochet

2026-01-29 20:09:01PHP

PHP 实现 WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时应用如聊天、游戏等。以下是使用 PHP 实现 WebSocket 的方法。

使用 ratchet/pawl 客户端库

安装 Ratchet 的 WebSocket 客户端库 pawl

composer require ratchet/pawl

客户端连接示例:

<?php
require __DIR__ . '/vendor/autoload.php';

$loop = \React\EventLoop\Factory::create();
$connector = new \Ratchet\Client\Connector($loop);

$connector('ws://echo.websocket.org')
    ->then(function(\Ratchet\Client\WebSocket $conn) {
        $conn->on('message', function($msg) use ($conn) {
            echo "Received: {$msg}\n";
            $conn->close();
        });

        $conn->send('Hello WebSocket!');
    }, function(\Exception $e) use ($loop) {
        echo "Error: {$e->getMessage()}\n";
        $loop->stop();
    });

$loop->run();

使用 ratchet/ratchet 创建服务端

安装 Ratchet 库:

composer require cboden/ratchet

服务端实现示例:

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

require __DIR__ . '/vendor/autoload.php';

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

使用 Swoole 扩展

Swoole 是 PHP 的高性能异步框架,内置 WebSocket 支持。

安装 Swoole:

pecl install swoole

服务端代码示例:

<?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) {
    echo "Received message: {$frame->data}\n";
    $server->push($frame->fd, "Server: {$frame->data}");
});

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

$server->start();

原生 PHP 实现

对于简单场景,可使用 socket_create 等函数实现基础 WebSocket 握手。

握手处理示例:

php实现websochet

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

while ($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\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $key\r\n\r\n";
        socket_write($client, $response, strlen($response));
        // 后续实现消息处理
    }
}

注意事项

  • 生产环境推荐使用成熟的库如 Ratchet 或 Swoole,原生实现仅适合学习。
  • WebSocket 需要 PHP 5.4 或更高版本。
  • 注意处理连接异常和资源释放。
  • 对于高性能需求,考虑使用 Swoole 或 Workerman 等异步框架。

以上方法可根据项目需求选择适合的方案实现 WebSocket 功能。

标签: phpwebsochet
分享给朋友:

相关文章

php实现定时任务

php实现定时任务

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

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…

php https实现

php https实现

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

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (f…