当前位置:首页 > PHP

PHP实现websocket通信

2026-02-16 11:12:27PHP

PHP实现WebSocket通信的方法

WebSocket是一种在单个TCP连接上进行全双工通信的协议。PHP可以通过以下方法实现WebSocket服务端功能:

使用原生PHP socket函数

PHP提供了socket扩展,可以直接操作底层socket实现WebSocket协议:

PHP实现websocket通信

$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 = array($socket);

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

    if (in_array($socket, $read)) {
        $new_client = socket_accept($socket);
        $clients[] = $new_client;
        $header = socket_read($new_client, 1024);
        performHandshake($header, $new_client);
    }

    foreach ($read as $read_socket) {
        if ($read_socket == $socket) continue;

        $data = socket_read($read_socket, 1024);
        if ($data === false) {
            socket_close($read_socket);
            unset($clients[array_search($read_socket, $clients)]);
            continue;
        }

        $unmasked = unmask($data);
        echo "Received: ".$unmasked.PHP_EOL;
        $response = mask("Server received: ".$unmasked);
        socket_write($read_socket, $response, strlen($response));
    }
}

function performHandshake($header, $client) {
    // WebSocket握手处理逻辑
}

function unmask($text) {
    // 数据解掩码逻辑
}

function mask($text) {
    // 数据掩码逻辑
}

使用Ratchet库

Ratchet是一个流行的PHP WebSocket库,简化了WebSocket实现:

PHP实现websocket通信

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

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("Server received: ".$msg);
    }

    public function onClose(ConnectionInterface $conn) {
        echo "Connection {$conn->resourceId} has disconnected\n";
    }

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

$app = new Ratchet\App('localhost', 8080);
$app->route('/chat', new MyWebSocket);
$app->run();

使用Swoole扩展

Swoole提供了高性能的WebSocket服务器实现:

$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 received: {$frame->data}");
});

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

$server->start();

客户端连接示例

HTML5 WebSocket客户端连接代码:

var ws = new WebSocket('ws://localhost:8080');
ws.onopen = function() {
    ws.send('Hello Server');
};
ws.onmessage = function(e) {
    console.log('Server: ' + e.data);
};
ws.onclose = function() {
    console.log('Connection closed');
};

注意事项

  • WebSocket需要PHP 5.3或更高版本
  • 原生PHP实现需要处理握手协议和数据帧解析
  • 生产环境推荐使用Ratchet或Swoole等成熟解决方案
  • 需要考虑安全性,如实现WSS(WebSocket Secure)
  • 对于高并发场景,Swoole性能更优

以上方法可以根据项目需求选择适合的实现方式。原生PHP实现适合学习WebSocket协议原理,而Ratchet和Swoole更适合生产环境部署。

标签: 通信PHP
分享给朋友:

相关文章

h5实现通信

h5实现通信

H5实现通信的方法 H5(HTML5)提供了多种通信方式,适用于不同场景的需求。以下是常见的几种实现方法: WebSocket通信 WebSocket是一种全双工通信协议,适用于实时性要求高的场景。…

PHP http长连接的实现

PHP http长连接的实现

HTTP 长连接基础概念 HTTP长连接(Keep-Alive)允许在单个TCP连接上发送和接收多个HTTP请求/响应,减少重复建立和断开连接的开销。HTTP/1.1默认启用长连接,而HTTP/1.0…

PHP实现会员管理

PHP实现会员管理

PHP实现会员管理的方法 数据库设计 创建会员表(members)包含字段:id(主键)、username、password(建议加密存储)、email、register_time、last_logi…

mvc实现 PHP

mvc实现 PHP

MVC 模式概述 MVC(Model-View-Controller)是一种设计模式,用于将应用程序的逻辑分离为三个核心组件:模型(Model)处理数据,视图(View)负责展示,控制器(Contro…

PHP实现HTML

PHP实现HTML

PHP实现HTML的方式 PHP作为服务器端脚本语言,可以直接嵌入HTML代码中生成动态网页内容。以下是几种常见实现方式: 混合编写 直接在.php文件中混合PHP与HTML代码: <!DO…

PHP类实现

PHP类实现

PHP类的实现方法 PHP中类的实现主要围绕面向对象编程(OOP)的核心概念展开,包括类定义、属性、方法、构造函数、访问控制等。以下是一个完整的PHP类实现示例: class Person {…