통신 프로토콜의 역할

TCP는 스트림 기반이기 때문에 클라이언트가 보내는 요청 데이터가 물의 흐름처럼 서버로 들어갑니다. 서버는 데이터가 도착했을 때 데이터가 완전한지 확인해야 합니다. 요청의 일부 데이터만 서버에 도착했거나 여러 요청이 연속적으로 서버에 도달할 수 있기 때문입니다. 요청이 모두 도달했는지 또는 여러 요청에서 하나의 요청을 분리하는 방법을 알아내려면 통신 프로토콜을 규정해야 합니다.

Workerman에서 프로토콜을 정하는 이유는 무엇인가?

전통적인 PHP 개발은 기본적으로 HTTP 프로토콜에 기반하고 있으며, HTTP 프로토콜의 분석 및 처리는 웹 서버가 독립적으로 처리합니다. 따라서 개발자는 프로토콜 관련 사항에 신경쓰지 않아도 됩니다. 그러나 비HTTP 프로토콜을 기반으로 개발할 때는 개발자가 프로토콜에 대해 고려해야 합니다.

Workerman에서 지원하는 프로토콜

현재 Workerman은 HTTP, websocket, text 프로토콜 (첨부 설명 참조), frame 프로토콜 (첨부 설명 참조), ws 프로토콜 (첨부 설명 참조)을 지원합니다. 이러한 프로토콜을 기반으로 통신할 필요가 있을 경우 직접 사용할 수 있습니다. 사용 방법은 Worker를 초기화할 때 프로토콜을 지정하는 것입니다. 예를 들어:

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// websocket://0.0.0.0:2345는 websocket 프로토콜로 2345 포트를 리스닝함을 나타냅니다.
$websocket_worker = new Worker('websocket://0.0.0.0:2345');

// text 프로토콜
$text_worker = new Worker('text://0.0.0.0:2346');

// frame 프로토콜
$frame_worker = new Worker('frame://0.0.0.0:2347');

// tcp Worker는 소켓을 통해 직접 전송하며, 애플리케이션 계층 프로토콜을 사용하지 않습니다.
$tcp_worker = new Worker('tcp://0.0.0.0:2348');

// udp Worker는 애플리케이션 계층 프로토콜을 사용하지 않습니다.
$udp_worker = new Worker('udp://0.0.0.0:2349');

// unix 도메인 Worker는 애플리케이션 계층 프로토콜을 사용하지 않습니다.
$unix_worker = new Worker('unix:///tmp/wm.sock');

사용자 정의 통신 프로토콜 사용하기

Workerman이 제공하는 통신 프로토콜로 개발 요구 사항이 충족되지 않는 경우, 개발자는 자신만의 통신 프로토콜을 정의할 수 있습니다. 정의 방법은 다음 섹션의 내용을 참조하십시오.

팁:

Workerman에는 텍스트 프로토콜이 내장되어 있으며, 프로토콜 형식은 텍스트 + 개행 문자입니다. 텍스트 프로토콜의 개발 및 디버깅은 매우 간단하며, 대다수의 사용자 정의 프로토콜 시나리오에서 사용될 수 있습니다. 또한 telnet 디버깅을 지원합니다. 만약 개발자가 자신만의 애플리케이션 프로토콜을 개발하고자 한다면, 텍스트 프로토콜을 직접 사용할 수 있으며, 따로 개발할 필요가 없습니다.

텍스트 프로토콜에 대한 설명은 《부록 텍스트 프로토콜 부분》을 참조하십시오.