当前位置:首页 > PHP

web socket实现php

2026-02-16 07:07:22PHP

WebSocket 实现 PHP

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适用于实时应用如聊天、游戏或实时数据更新。在 PHP 中实现 WebSocket 通常需要结合后端服务器和前端 JavaScript。

使用 Ratchet 库实现 WebSocket

Ratchet 是一个流行的 PHP WebSocket 库,基于 ReactPHP 实现。

安装 Ratchet 通过 Composer 安装 Ratchet:

composer require cboden/ratchet

创建 WebSocket 服务器 创建一个 PHP 文件(如 server.php)并编写以下代码:

<?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

前端连接 WebSocket

在前端 JavaScript 中连接 WebSocket 服务器:

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

socket.onopen = function(e) {
    console.log('Connected to WebSocket server');
};

socket.onmessage = function(e) {
    console.log('Message from server:', e.data);
};

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

// 发送消息
function sendMessage() {
    const message = document.getElementById('message').value;
    socket.send(message);
}
</script>

使用 PHP 原生 Socket 实现

对于更底层的实现,可以使用 PHP 的 socket 扩展。

创建 Socket 服务器

<?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);
    $data = socket_read($client, 1024);

    // 处理 WebSocket 握手
    if (strpos($data, 'Upgrade: websocket') !== false) {
        $headers = explode("\r\n", $data);
        $key = '';
        foreach ($headers as $header) {
            if (strpos($header, 'Sec-WebSocket-Key') !== false) {
                $key = trim(substr($header, 19));
                break;
            }
        }
        $accept = base64_encode(sha1($key . '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: $accept\r\n\r\n";
        socket_write($client, $response, strlen($response));
    }

    // 处理消息(需解析 WebSocket 帧)
    // ...
}

注意事项

  • 性能问题:PHP 是单线程的,原生实现可能不适合高并发场景。推荐使用 Ratchet 或 Swoole(高性能 PHP 协程框架)。
  • 安全性:确保实现 WebSocket 握手和帧解析的正确性,避免安全漏洞。
  • 生产环境:考虑使用 Nginx 或 Apache 反向代理 WebSocket 连接。

通过以上方法,可以在 PHP 中实现 WebSocket 功能,适用于实时通信需求。

web socket实现php

标签: websocket
分享给朋友:

相关文章

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue实现socket连接

vue实现socket连接

Vue 中实现 Socket 连接 使用原生 WebSocket 在 Vue 项目中可以直接使用浏览器原生 WebSocket API 实现连接。创建一个 WebSocket 实例并监听事件即可完成基…

web vue实现悬浮按钮

web vue实现悬浮按钮

Vue 实现悬浮按钮的方法 在 Vue 项目中实现悬浮按钮可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 固定定位 通过 CSS 的 position: fixed 属性可以轻松实现悬浮…

web制作css

web制作css

CSS基础语法与结构 CSS由选择器和声明块组成。选择器指向需要样式化的HTML元素,声明块包含一个或多个用分号分隔的声明。每个声明由属性和值组成,用冒号分隔。 选择器 { 属性: 值; 属…

web css制作

web css制作

CSS 制作基础 CSS(层叠样式表)用于控制网页的外观和布局。通过 CSS 可以定义颜色、字体、间距、动画等样式。 基本语法 CSS 规则由选择器和声明块组成: 选择器 { 属性: 值;…

php socket实现长连接

php socket实现长连接

PHP Socket 实现长连接的方法 使用 stream_socket_server 创建服务器端 在 PHP 中可以通过 stream_socket_server 创建一个 TCP 服务器。以下是…