기본 프로세스
(간단한 Websocket 채팅 서버를 예로 들겠습니다)
1. 임의의 위치에 프로젝트 디렉토리 생성
예를 들어 SimpleChat/
디렉토리에 들어가서 composer require workerman/workerman을 실행합니다.
2. vendor/autoload.php 불러오기 (composer 설치 후 생성됨)
start.php 파일을 생성하고 vendor/autoload.php를 불러옵니다.
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
3. 프로토콜 선택
여기서는 Text 텍스트 프로토콜을 선택합니다(Workerman에서 정의한 프로토콜로, 형식은 텍스트+줄바꿈입니다).
(현재 Workerman은 HTTP, Websocket, Text 텍스트 프로토콜을 지원하며, 다른 프로토콜을 사용해야 하는 경우, 프로토콜 장을 참조하여 자신만의 프로토콜을 개발하세요.)
4. 필요한 경우 엔트리 시작 스크립트 작성
예를 들어, 아래는 간단한 채팅방의 엔트리 파일입니다.
SimpleChat/start.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$global_uid = 0;
// 클라이언트가 연결되면 uid를 할당하고 연결을 저장하며 모든 클라이언트에 알립니다.
function handle_connection($connection)
{
global $text_worker, $global_uid;
// 이 연결에 uid를 할당합니다.
$connection->uid = ++$global_uid;
}
// 클라이언트가 메시지를 보내면 모든 사람에게 전달합니다.
function handle_message(TcpConnection $connection, $data)
{
global $text_worker;
foreach($text_worker->connections as $conn)
{
$conn->send("user[{$connection->uid}] said: $data");
}
}
// 클라이언트가 연결을 끊으면 모든 클라이언트에게 브로드캐스트합니다.
function handle_close($connection)
{
global $text_worker;
foreach($text_worker->connections as $conn)
{
$conn->send("user[{$connection->uid}] logout");
}
}
// 텍스트 프로토콜의 Worker를 생성하여 2347 포트를 수신합니다.
$text_worker = new Worker("text://0.0.0.0:2347");
// 단 하나의 프로세스만 시작하여 클라이언트 간 데이터 전송을 편리하게 합니다.
$text_worker->count = 1;
$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';
Worker::runAll();
5. 테스트
Text 프로토콜은 telnet 명령어로 테스트할 수 있습니다.
telnet 127.0.0.1 2347