PHP와 WebSocket을 사용하여 실시간 협업 도구를 개발하는 방법

PHPz
풀어 주다: 2023-12-17 22:46:02
원래의
803명이 탐색했습니다.

PHP와 WebSocket을 사용하여 실시간 협업 도구를 개발하는 방법

인터넷과 모바일 장치의 대중화로 인해 업무 효율성을 높이기 위해 실시간 공동 작업 도구가 점점 더 필요해지고 있습니다. 이러한 배경에서 실시간 공동 작업 도구의 인스턴트 메시징 및 공동 편집과 같은 기능이 점점 더 대중화되고 있습니다. 이 기사에서는 PHP와 WebSocket의 도움으로 실시간 웹 기반 협업 도구를 구현하는 방법을 소개합니다. 관련 코드 예제도 제공됩니다.

WebSocket 소개

WebSocket은 새로운 유형의 웹 통신 프로토콜로, HTTP 프로토콜이 아닌 TCP 프로토콜을 기반으로 하며 양방향 통신 기능을 제공할 수 있습니다. Ajax 폴링 기술과 비교하여 WebSocket은 강력한 실시간 성능과 높은 통신 효율성이라는 장점을 가지고 있습니다.

이전에는 실시간으로 브라우저에 데이터를 푸시하려는 경우 일반적으로 긴 폴링 기술이 사용되었습니다. 즉, 클라이언트가 서버에 요청을 보내고 새 데이터를 사용할 수 있을 때까지 응답을 기다렸다가 반환했습니다. 응답. 이 접근 방식의 문제점은 요청과 응답이 쌍으로 이루어지면 요청이 빈번할 경우 서버에 많은 부담을 준다는 것입니다. WebSocket은 통신이 설정된 후에도 장기간 연결을 유지할 수 있으며 서버가 클라이언트에 메시지를 적극적으로 푸시하는 기능을 실현할 수 있습니다.

WebSocket의 통신 프로토콜은 HTTP와 같은 핸드셰이크를 사용하여 새 세션을 시작한 다음 양쪽 끝에서 양방향 데이터 전송을 수행합니다. WebSocket 통신 프로토콜은 일반 HTTP 프로토콜을 통해 연결을 설정한 후 WebSocket 연결로 변환할 수 있으므로 특별한 방법이나 포트를 통해 연결할 필요가 없습니다.

WebSocket 구현

먼저 서버측 PHP 코드에서 WebSocketServer 클래스를 생성하고 관련 메서드를 구현해야 합니다.

class WebSocketServer {
    public function __construct($host, $port){
        $this->host = $host;
        $this->port = $port;
        $this->sockets = array();
        $this->users = array();
    }

    public function run(){
        $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_bind($server, $this->host, $this->port);
        socket_listen($server);

        $this->sockets[] = $server;
        echo "WebSocket服务器运行在 $this->host:$this->port
";

        while(true){
            $new_sockets = $this->sockets;
            $write = NULL;
            $except = NULL;
            socket_select($new_sockets, $write, $except, NULL);
            foreach($new_sockets as $socket){
                if ($socket == $server){
                    $client = socket_accept($server);
                    $this->sockets[] = $client;
                    $this->users[] = array('socket'=>$client);
                } else {
                    $bytes = @socket_recv($socket, $buffer, 1024, MSG_DONTWAIT);
                    if ($bytes == 0) {
                        $index = $this->find_user_by_socket($socket);
                        if ($index >= 0) {
                            array_splice($this->users, $index, 1);
                        }
                        socket_close($socket);
                        $key = array_search($socket, $this->sockets);
                        array_splice($this->sockets, $key, 1);
                    } else {
                        $index = $this->find_user_by_socket($socket);
                        if($index >= 0) {
                            $msg = $buffer;
                            $this->handle_message($msg, $this->users[$index]);
                        }
                    }
                }
            }
        }
    }

    private function find_user_by_socket($socket){
        $found = -1;
        foreach($this->users as $index => $user){
            if ($user['socket'] == $socket){
                $found = $index;
                break;
            }
        }
        return $found;
    }

    private function handle_message($msg, $user) {
        // 处理新消息
    }
}
로그인 후 복사

WebSocket 프로토콜에서 메시지는 4~10바이트의 길이 헤더로 시작합니다. , 실제 데이터가 이어집니다. 위 코드에서는 길이 헤더를 구문 분석한 다음 해당 길이의 데이터 부분을 읽어야 합니다.

private function handle_message($msg, $user) {
    if(strlen($msg) === 0) {
        return;
    }

    $code = ord(substr($msg, 0, 1)) & 0x0F;
    switch ($code){
        case 0x01: // 文本数据
            $msg = substr($msg, 1);
            break;
        case 0x02: // 二进制数据
            $msg = substr($msg, 1);
            break;
        case 0x08: // 连接关闭
            $index = $this->find_user_by_socket($user['socket']);
            if ($index >= 0) {
                array_splice($this->users, $index, 1);
            }
            socket_close($user['socket']);
            $key = array_search($user['socket'], $this->sockets);
            array_splice($this->sockets, $key, 1);
            return;
        case 0x09: // ping
        case 0x0A: // pong
            return;
        default:
            return;
    }

    // 处理新消息
}
로그인 후 복사

handle_message 메소드에서는 덤프 및 다른 클라이언트로 전송과 같이 클라이언트로부터 받은 새 메시지를 처리할 수 있습니다.

WebSocket의 클라이언트 측 구현

클라이언트 측에서는 JavaScript를 사용하여 WebSocket 연결을 생성하고 메시지를 보내고 받아야 합니다. 다음은 WebSocket 서버에 연결하기 위한 JavaScript 코드입니다.

var ws = new WebSocket("ws://localhost:8080/");
ws.onopen = function() {
    console.log("Connected to WebSocket server");
};

ws.onmessage = function(evt) {
    console.log("Received message: " + evt.data);
};

ws.onclose = function(evt) {
    console.log("Disconnected from WebSocket server");
};
로그인 후 복사

위 코드에서는 WebSocket 생성자를 사용하여 WebSocket 개체를 생성하고 이를 WebSocket 서버에 연결합니다. 또한 WebSocket 연결 상태와 수신된 메시지를 모니터링하기 위해 여러 이벤트 리스너(onopen, onmessage 및 onclose)를 설정했습니다.

WebSocket 서버에 데이터를 보내려면 WebSocket 개체의 send 메서드를 사용할 수 있습니다.

ws.send("Hello, WebSocket server!");
로그인 후 복사

WebSocket 서버에서 새 메시지가 수신되면 onmessage 이벤트가 트리거되고 수신된 메시지를 얻을 수 있습니다. 이벤트 객체에서 데이터로 메시지를 보냅니다.

실시간 협업 도구 적용

WebSocket 통신 지원으로 실제 협업 도구 애플리케이션을 개발할 수 있습니다. 공동 작업 도구에서는 다음 기능을 구현해야 합니다.

  • 사용자 로그인/로그아웃
  • 인스턴트 채팅 메시지 보내기
  • 여러 사용자가 동일한 문서를 공동으로 편집
  • 다른 사용자에게 변경 사항 및 피드백 제출

이를 분리할 수 있습니다. 함수는 다양한 PHP 클래스로 구현되고 실제 비즈니스 요구에 따라 개선됩니다. 다음은 예시입니다.

class WebSocketChat {

    private $users = array();

    public function onOpen($user){
        $this->users[$user['id']] = $user;
        $this->sendToAll(array('type'=>'notice','from'=>'System','msg'=>"{$user['name']}进入聊天室"));
    }

    public function onMessage($user, $msg){
        $this->sendToAll(array('type'=>'msg','from'=>$user['name'],'msg'=>$msg));
    }

    public function onClose($user){
        unset($this->users[$user['id']]);
        $this->sendToAll(array('type'=>'notice','from'=>'System','msg'=>"{$user['name']}离开聊天室"));
    }

    private function sendToAll($msg){
        foreach($this->users as $user){
            $this->send($user, $msg);
        }
    }

    private function send($user, $msg){
        socket_write($user['socket'], $this->encode(json_encode($msg)));
    }

    private function encode($msg){
        $len = strlen($msg);
        if($len <= 125){

        }

        if($len <= 65535){

        }


    }
}
로그인 후 복사

위 예시에서는 로그인, 로그아웃, 메시지 보내기 및 기타 기능을 포함한 간단한 채팅방을 구현했습니다. WebSocketChat 클래스에서는 사용자 목록을 유지하고 사용자가 연결할 때 onOpen 메서드를 통해 새 사용자를 추가합니다. 사용자로부터 메시지를 받으면 sendToAll 메서드를 호출하여 연결된 모든 사용자에게 메시지를 보냅니다. 사용자의 연결이 끊어지면 사용자 목록에서 해당 사용자를 제거하고 해당 사용자가 떠났다는 사실을 다른 사용자에게 알립니다.

결론

이 글에서는 PHP와 WebSocket의 도움으로 실시간 웹 기반 협업 도구를 구현하는 방법을 소개하고 관련 코드 예제를 제공했습니다. 인터넷과 모바일 장치의 대중화로 인해 실시간 협업 도구에 대한 수요가 점점 더 많아질 것입니다. 개발자는 사용자 요구를 더 잘 충족하기 위해 실제 요구 사항을 기반으로 2차 개발을 수행할 수 있습니다.

위 내용은 PHP와 WebSocket을 사용하여 실시간 협업 도구를 개발하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!