학습
PHP PHP에서의 웹소켓
PHP PHP에서의 웹소켓 — 고급
PHP에서의 웹소켓
1. 도입 (왜 배워야 하는가)
웹소켓은 실시간 양방향 통신을 가능하게 하는 프로토콜입니다. 특히 사용자와 서버 간의 지속적인 연결을 유지할 수 있어, 채팅 애플리케이션, 실시간 알림, 게임 등에서 필수적으로 사용됩니다.
실무에서 웹소켓을 활용하지 않으면 사용자 경험이 크게 저하될 수 있습니다. 예를 들어, 채팅 애플리케이션에서 사용자의 메시지가 서버에 도달할 때까지의 지연이 길어지면, 사용자들은 불편을 느끼고 애플리케이션을 떠날 가능성이 높아집니다. 따라서 웹소켓을 통해 실시간으로 데이터를 처리하고 사용자와의 상호작용을 향상시키는 것이 중요합니다.
2. 핵심 개념 설명
웹소켓(WebSocket)
- 정의: 웹소켓은 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜입니다.
- 비유: 일반적인 HTTP 통신은 한 번의 대화 후 연결이 끊어지는 전화통화와 같다면, 웹소켓은 대화를 계속 이어나가는 친구와의 대화와 같습니다.
관련 용어
| 용어 | 설명 |
|---|---|
| 핸드셰이크 | 클라이언트와 서버가 웹소켓 연결을 설정하는 과정 |
| 메시지 | 클라이언트와 서버 간의 데이터 전송 단위 |
| 이벤트 | 특정 상황에서 발생하는 행동 |
3. 기본 코드 예제
아래는 PHP에서 웹소켓 서버를 설정하는 기본 예제입니다.
<?php
$host = '127.0.0.1';
$port = 9000;
// 소켓 생성
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "서버가 실행 중입니다...\n";
// 클라이언트 연결 대기
while (true) {
$client = socket_accept($socket);
// 클라이언트의 요청 처리
$request = socket_read($client, 1024);
echo "클라이언트의 요청: $request\n";
// 핸드셰이크
$headers = [];
preg_match('#Sec-WebSocket-Key: (.)\r\n#', $request, $headers);
$acceptKey = base64_encode(pack('H', sha1($headers[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
$response = "HTTP/1.1 101 Switching Protocols\r\n" .
"Upgrade: websocket\r\n" .
"Connection: Upgrade\r\n" .
"Sec-WebSocket-Accept: $acceptKey\r\n\r\n";
socket_write($client, $response, strlen($response));
// 클라이언트와의 통신 예시
socket_write($client, "환영합니다!", 13);
socket_close($client);
}
?>
실행 결과
서버가 실행 중입니다...
클라이언트의 요청: ... (클라이언트의 요청 내용)
코드 한 줄씩 동작 설명
$host와$port에 서버 IP와 포트를 지정합니다.socket_create()로 새 소켓을 생성합니다.socket_bind()로 소켓에 IP와 포트를 바인딩합니다.socket_listen()으로 클라이언트의 연결 요청을 대기합니다.while루프에서 클라이언트의 연결을 기다리며, 연결이 이루어지면$client에 클라이언트 소켓을 저장합니다.socket_read()로 클라이언트의 요청을 읽어옵니다.- 핸드셰이크 과정을 통해 클라이언트와 서버의 연결을 설정합니다.
- 클라이언트에게 환영 메시지를 전송하고 소켓을 닫습니다.
- 잘못된 코드: 핸드셰이크 과정을 생략하면 클라이언트와 서버 간의 연결이 성립되지 않습니다.
- 올바른 코드: 반드시 핸드셰이크 과정을 구현해야 연결이 정상적으로 이루어집니다.
- 잘못된 코드: 메시지를 단순히 전송하는 것에만 집중하고 프레임 처리를 소홀히 하면, 데이터 손실이 발생할 수 있습니다.
- 올바른 코드: 웹소켓 메시지는 특정 포맷으로 인코딩되어야 하며, 이를 처리하는 로직을 구현해야 합니다.
- 웹소켓은 클라이언트와 서버 간의 실시간 양방향 통신을 가능하게 합니다.
- 핸드셰이크 과정을 통해 연결을 설정하고, 메시지를 프레임으로 처리해야 합니다.
- 실무에서 웹소켓은 채팅, 알림, 게임 등 다양한 분야에서 활용됩니다.
- PHP에서의 주기적인 웹소켓 메시지 전송
- 웹소켓 클라이언트 구현 (JavaScript와의 연동)
- 보안 웹소켓 통신 (wss://) 구현 방법
4. 실전 활용 예제
예제 1: 채팅 애플리케이션
쇼핑몰에서 고객 서비스 채팅 기능을 구현할 때, 웹소켓을 사용하여 사용자가 질문을 입력할 때마다 실시간으로 응답을 받을 수 있습니다.
예제 2: 실시간 알림 시스템
주식 가격을 실시간으로 업데이트하는 대시보드를 구현할 때, 웹소켓을 통해 가격 변화가 발생할 때마다 클라이언트에게 즉시 알림을 보낼 수 있습니다.
예제 3: 게임 서버
멀티플레이어 게임에서 플레이어의 행동을 실시간으로 동기화하려면 웹소켓을 사용하여 각 플레이어의 상태를 서버와 클라이언트 간에 실시간으로 전송해야 합니다.