>  기사  >  백엔드 개발  >  PHP와 WebSocket을 사용하여 실시간 통신을 구현하는 방법

PHP와 WebSocket을 사용하여 실시간 통신을 구현하는 방법

WBOY
WBOY원래의
2023-12-17 22:24:441286검색

PHP와 WebSocket을 사용하여 실시간 통신을 구현하는 방법

인터넷 기술의 지속적인 발전으로 실시간 커뮤니케이션은 일상생활에서 없어서는 안 될 부분이 되었습니다. WebSockets 기술을 사용하면 효율적이고 지연 시간이 짧은 실시간 통신이 가능하며, 인터넷 분야에서 가장 널리 사용되는 개발 언어 중 하나인 PHP도 해당 WebSocket 지원을 제공합니다. 이 기사에서는 PHP와 WebSocket을 사용하여 실시간 통신을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

1. WebSocket이란

WebSocket은 단일 TCP 연결을 통한 전이중 통신을 위한 프로토콜입니다. HTTP 프로토콜과 달리 WebSocket 연결이 설정된 후에는 HTTP 요청 및 응답을 통해 상호 작용할 필요 없이 서버와 클라이언트 간에 직접 데이터를 교환할 수 있습니다. 이를 통해 WebSocket은 짧은 대기 시간, 높은 효율성의 실시간 통신을 달성할 수 있으며 높은 동시성과 실시간 상호 작용이 필요한 온라인 게임, 채팅방 및 기타 시나리오에 적합합니다.

2. PHP가 WebSocket을 지원하는 방법

PHP는 Ratchet, Wrench 등과 같은 WebSocket을 구현하기 위한 일부 라이브러리와 프레임워크를 제공합니다. 이러한 라이브러리와 프레임워크는 PHP 확장 Swoole을 기반으로 구현됩니다. Swoole은 비동기 IO, 코루틴 및 기타 기능을 지원하는 고성능 네트워크 통신 프레임워크로, 높은 동시성, 고성능 웹 서버, 게임을 구축하는 데 적합합니다. 서버 및 기타 애플리케이션.

이 글에서는 Ratchet 라이브러리를 사용하여 WebSocket을 구현하겠습니다. Ratchet은 표준 기반 RFC6455 WebSocket 프로토콜의 구현을 제공하며 사용 용이성, 유연성 및 높은 확장성의 특징을 가지고 있습니다. 동시에 Ratchet은 STOMP, WAMP 등과 같은 WebSocket 하위 프로토콜도 지원하고 개발자가 빠르게 시작할 수 있도록 완전한 문서와 샘플 코드를 제공합니다.

3. 실시간 통신을 구현하기 위한 샘플 코드

아래에서는 간단한 채팅방 애플리케이션을 사용하여 실시간 통신을 구현하기 위해 PHP 및 WebSocket을 사용하는 방법을 보여줍니다.

  1. Ratchet 설치

Ratchet을 로컬 또는 서버측에 설치합니다. Composer를 통해 설치할 수 있습니다.

composer require cboden/ratchet
  1. WebSocket 서버 작성

다음 코드를 사용하여 server.php PHP 파일을 만듭니다.

<?php
require dirname(__DIR__) . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetWebSocketMessageComponentTrait;

class Chat implements MessageComponentInterface
{
    use MessageComponentTrait;

    protected $clients;

    public function __construct()
    {
        $this->clients = new SplObjectStorage();
    }

    public function onOpen(ConnectionInterface $conn)
    {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})
";
    }

    public function onClose(ConnectionInterface $conn)
    {
        $this->clients->detach($conn);
        echo "Connection {$conn->resourceId} has disconnected
";
    }

    public function onError(ConnectionInterface $conn, Exception $e)
    {
        echo "An error has occurred: {$e->getMessage()}
";
        $conn->close();
    }

    public function onMessage(ConnectionInterface $from, $msg)
    {
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }
}

$server = new RatchetWebSocketWsServer(new Chat());
$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer('0.0.0.0:8080', $loop);
$server = new RatchetServerIoServer($server, $socket, $loop);
echo "Server started
";
$server->run();

위의 코드는 포트 8080에서 수신 대기하고 클라이언트 연결을 기다리는 간단한 채팅방 서버를 생성합니다. 클라이언트가 연결되면 onOpen 메서드가 호출되고 클라이언트 연결 개체가 ObjectStorage 개체에 저장됩니다. 클라이언트가 메시지를 보내면 onMessage 메서드가 호출되어 서버에 연결된 모든 클라이언트에게 메시지를 보냅니다. 클라이언트 연결이 끊어지면 onClose 메서드가 호출되어 ObjectStorage 개체에서 클라이언트 연결 개체를 삭제합니다.

  1. Writing a WebSocket client

다음 코드를 사용하여 HTML 파일 client.html을 만듭니다.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Chat Room</title>
    <style>
        #messages {
            margin-bottom: 10px;
            padding: 5px;
            border: 1px solid #ddd;
            overflow-y: scroll;
            height: 200px;
        }
    </style>
</head>
<body>
    <div>
        <input type="text" id="input-message" placeholder="Write a message...">
        <button id="btn-send">Send</button>
    </div>
    <div id="messages"></div>

    <script>
        var conn = new WebSocket('ws://localhost:8080');
        var messages = document.getElementById('messages');
        var inputMessage = document.getElementById('input-message');
        var btnSend = document.getElementById('btn-send');

        conn.onopen = function(e) {
            messages.innerHTML += '<div>Connected to server</div>'
        };

        conn.onmessage = function(e) {
            messages.innerHTML += '<div>' + e.data + '</div>'
        };

        conn.onerror = function(e) {
            console.log('An error occurred: ' + e.data);
        };

        conn.onclose = function(e) {
            messages.innerHTML += '<div>Connection closed</div>'
        };

        btnSend.onclick = function() {
            if (inputMessage.value) {
                conn.send(inputMessage.value);
                inputMessage.value = '';
            }
        };

        inputMessage.addEventListener('keydown', function(e) {
            if (e.keyCode === 13 && inputMessage.value.trim()) {
                conn.send(inputMessage.value);
                inputMessage.value = '';
            }
        });
    </script>
</body>
</html>

위 코드는 간단한 채팅방 클라이언트를 만들고 WebSocket을 통해 서버와 연결을 설정하며 서버의 메시지를 듣습니다. . 사용자가 텍스트 상자에 메시지를 입력하고 보내기 버튼을 클릭하거나 Enter 키를 누르면 해당 메시지가 서버로 전송되어 채팅창에 표시됩니다.

  1. WebSocket 서버 및 클라이언트 실행

터미널에서 WebSocket 서버 시작:

php server.php

웹 브라우저에서 클라이언트 페이지 client.html을 열고 메시지를 입력하고 보내면 메시지가 서버로 전송되는 것을 볼 수 있습니다. , 서버에 연결된 다른 클라이언트도 동일한 메시지를 받게 됩니다. 이런 식으로 우리는 PHP와 WebSocket을 사용하여 실시간 통신을 성공적으로 구현했습니다.

4. 요약

효율적이고 지연 시간이 짧은 실시간 통신 프로토콜인 WebSocket은 실시간 상호 작용의 새로운 방식을 제공합니다. 동시에 PHP는 풍부한 WebSocket 지원 라이브러리와 프레임워크를 제공하므로 효율적이고 빠르며 안정적인 WebSocket 애플리케이션을 쉽게 구축할 수 있습니다. 이 기사가 WebSocket 기술을 더 잘 이해하고 사용하며 더 많은 실시간 통신 애플리케이션을 구현하는 데 도움이 되기를 바랍니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.