ServBay에서 Swoole로 고성능 PHP 애플리케이션 구축하기
ServBay는 개발자를 위해 설계된 로컬 웹 개발 환경으로, 여러 프로그래밍 언어 환경, 데이터베이스, 각종 도구를 미리 통합하여 로컬 개발의 번거로움을 크게 줄여줍니다. 이 문서에서는 ServBay 환경에서 Swoole 확장 모듈을 활용해 PHP 애플리케이션을 고성능 네트워크 서비스로 만드는 방법을 중점적으로 설명합니다.
Swoole이란?
Swoole은 PHP에 특화된 코루틴 기반의 병렬 및 고성능 네트워크 통신 엔진입니다. 순수 C 언어로 구현되어, PHP에 비동기·병렬·코루틴 네트워킹 기능을 제공합니다. Swoole을 이용하면 기존 웹 서버(Apache/Nginx + PHP-FPM)의 요청-응답 구조에서 벗어나, 상시 메모리 상주 웹 서버·비동기 태스크 처리·실시간 통신 서비스(WebSocket 등) 등 고동시성을 요구하는 작업을 훨씬 효율적으로 구현할 수 있습니다.
Swoole의 주요 특징:
- 고성능: C 언어 기반으로, 비동기 I/O와 멀티 프로세스/멀티 스레드를 지원합니다.
- 코루틴: 경량 코루틴으로 동기형 코드를 비동기로 실행해, 비동기 프로그래밍 모델을 간결하게 만듭니다.
- 다양한 프로토콜: TCP/UDP/HTTP/WebSocket 등 여러 네트워크 프로토콜을 네이티브로 지원합니다.
- 쉬운 사용: PHP 개발자에게 익숙한 API 형태로 제공됩니다.
- 메모리 상주 프로세스: 애플리케이션을 예전처럼 매 요청마다 초기화하는 대신, 상시 프로세스로 실행하여 불필요한 오버헤드를 줄입니다.
Swoole을 활용하면 PHP가 단순한 웹 스크립트 언어를 넘어, 고성능 네트워크 애플리케이션에도 폭넓게 활용될 수 있습니다.
ServBay에서 Swoole 활성화하기
ServBay의 설계 목표 중 하나는 다양한 PHP 확장 모듈을 쉽게 설치·관리할 수 있게 하는 것입니다. Swoole은 현대 PHP 고성능 개발에 필수적인 확장 모듈로서, 이미 ServBay에 기본 탑재되어 있습니다. 간단한 단계로 Swoole을 활성화할 수 있습니다.
준비물:
- ServBay가 설치 및 실행되어 있을 것
- ServBay에 최소 1개의 PHP 버전이 설치되어 있을 것
활성화 방법:
- ServBay 앱을 실행합니다.
- "패키지(Packages)" 또는 PHP 버전 관리 화면으로 이동합니다. (ServBay 버전에 따라 명칭이 다를 수 있으며, 보통 메인 화면이나 설정에서 찾을 수 있습니다)
- Swoole을 활성화할 PHP 버전을 선택합니다.
- Swoole 확장 항목을 찾아 체크(활성화)합니다. ServBay에서는 빌드된 확장 모듈을 리스트나 스위치 형태로 볼 수 있습니다.
- 변경 내용을 저장하고 안내에 따라 ServBay나 해당 PHP 서비스를 재시작합니다. ServBay가 자동으로 PHP 환경을 구성하여 Swoole을 로드하도록 만듭니다.
이 과정을 마친 뒤, 선택한 PHP 버전에서 Swoole을 사용할 수 있습니다. 명령줄에서 php -m
을 실행하여 swoole
모듈이 로드됐는지 확인할 수 있습니다.
TIP
ServBay는 웹사이트와 프로젝트 파일을 아래 디렉토리에 저장할 것을 권장합니다. 이를 따르면 ServBay의 사이트 관리 및 설정이 훨씬 쉬워집니다.
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
이 문서의 예제에서도 해당 경로를 기준으로 설명합니다.
Swoole HTTP 서버 간단 구축하기
이제 간단한 Swoole HTTP 서버를 만들어 웹 요청을 처리하는 방법을 살펴봅니다.
1단계: 프로젝트 디렉토리 생성
터미널을 열고, 새로운 프로젝트 디렉토리를 만들고 이동합니다. ServBay의 권장 경로를 사용합니다:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
2단계: 서버 스크립트 작성
servbay-swoole-http
폴더에서 server.php
파일을 만들고 아래 코드를 추가합니다:
php
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// Swoole HTTP 서버 인스턴스 생성
// 모든 네트워크 인터페이스(0.0.0.0)의 9501 포트에서 대기
$server = new Server("0.0.0.0", 9501);
// 'start' 이벤트 콜백 등록
// 서버가 성공적으로 실행되면 작동
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// 여기서 마스터 프로세스 ID, 관리자 프로세스 ID 등 기록 가능
});
// 'request' 이벤트 콜백 등록
// 새로운 HTTP 요청이 도착할 때마다 실행
$server->on("request", function (Request $request, Response $response) {
// 응답 헤더 설정
$response->header("Content-Type", "text/plain");
// 요청 경로나 파라미터에 따라 처리 로직 구현
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Request path: " . $path . "\n";
$content .= "Method: " . $request->server['request_method'] . "\n";
$content .= "Client IP: " . $request->server['remote_addr'] . "\n";
// 더 많은 요청 정보는 $request 객체로 확인 가능
}
// 응답 본문을 전송하고 요청 종료
$response->end($content);
});
// 서버 실행
$server->start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
위 코드는 9501 포트에서 HTTP 요청을 대기하는 Swoole HTTP 서버를 생성합니다. 기본적으로 "Hello ServBay!"라는 텍스트를 반환하며, /info
경로로 접근하면 요청 정보가 출력됩니다.
3단계: Swoole 서버 실행
터미널에서 지금 작업 중인 위치가 servbay-swoole-http
디렉토리인지 확인한 뒤, Swoole이 활성화된 ServBay의 PHP 버전으로 스크립트를 실행합니다:
bash
php server.php
1
정상적으로 실행되면 터미널에 아래와 같이 표시됩니다:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
이는 Swoole HTTP 서버가 9501 포트에서 실행 중임을 의미합니다.
4단계: Swoole 서버 접속
웹 브라우저에서 아래 주소로 접속하세요:
http://localhost:9501
http://localhost:9501/info
각각 "Hello ServBay!"와 요청 정보가 담긴 텍스트를 확인할 수 있습니다.
서버를 종료하려면, 해당 터미널 창에서 Ctrl + C
를 누르세요.
Swoole로 WebSocket 연결 처리하기
Swoole은 WebSocket 프로토콜을 네이티브로 지원하여, 실시간 채팅방·게임 서버·실시간 데이터 푸시 등 실시간 통신이 필요한 앱에 매우 적합합니다.
1단계: WebSocket 서버 스크립트 작성
(프로젝트 디렉토리로 servbay-swoole-http
를 쓰거나 새로 servbay-swoole-websocket
폴더를 만들어도 됩니다) 해당 위치에서 websocket_server.php
파일을 생성하고 아래 코드를 추가합니다:
프로젝트 경로:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Swoole WebSocket 서버 인스턴스 생성
// WebSocket 서버는 HTTP 서버를 상속하므로, HTTP 요청도 처리 가능
$server = new Server("0.0.0.0", 9502); // 9502 포트 대기
// 'start' 이벤트: 서버 시작 시 실행
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// 'open' 이벤트
// 새 WebSocket 연결 생성 시 실행
// $request 객체에서 클라이언트 연결 정보 확인, 예: $request->fd는 파일 디스크립터
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// 클라이언트에 환영 메시지 전송 가능
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// 'message' 이벤트
// 서버가 클라이언트의 메시지를 받을 때 실행
// $frame 객체에서 메시지와 보낸 클라이언트 정보 확인
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// 모든 연결된 클라이언트에게 메시지 브로드캐스트 또는 보낸이에게 응답
// 예시: 보낸이에게만 응답
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// 브로드캐스트 예제 (연결 리스트 관리 또는 순회 필요)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // 보낸이 자신에게는 전송하지 않음
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// 'close' 이벤트
// 클라이언트 연결 종료 시 실행
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// 서버 실행
$server->start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
이 코드는 9502 포트에서 대기하는 Swoole WebSocket 서버를 생성합니다. 주요 이벤트(start
: 서버 시작, open
: 새 연결, message
: 메시지 수신, close
: 연결 종료)에 대한 콜백을 등록하여, 받은 메시지를 전송자에게 되돌려 보내는 예시를 포함합니다.
2단계: WebSocket 서버 실행
websocket_server.php
가 있는 경로에서 Swoole이 활성화된 ServBay PHP 버전으로 아래 명령어를 실행하세요:
bash
php websocket_server.php
1
실행되면 터미널에 아래 메시지가 보입니다:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
즉, 9502 포트에서 WebSocket 서버가 정상 대기 중입니다.
3단계: WebSocket 서버 접근 테스트
여러 방법으로 WebSocket 서버에 연결하여 작동을 확인할 수 있습니다.
방법 A: 브라우저 개발자 도구 활용
최신 브라우저의 개발자 도구(F12)는 "네트워크(Network)" 또는 "콘솔(Console)" 패널을 제공하며 WebSocket 테스트가 가능합니다.
임의의 페이지(예:
about:blank
)를 엽니다.개발자 도구를 열고 "콘솔(Console)" 패널로 이동합니다.
아래 자바스크립트 코드를 실행합니다:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // 연결 후 메시지 전송 }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // 서버가 보낸 메시지 }; ws.onerror = function(event) { console.error("WebSocket error:", event); // 오류 발생 시 }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // 연결 종료 }; // 언제든 ws.send("메시지")로 메시지 전송 가능 // ws.close()로 연결 종료 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21콘솔에서 위 코드를 실행하면 결과를 볼 수 있습니다. 동시에
websocket_server.php
를 실행하는 터미널에서도 연결 및 메시지 로그가 출력됩니다.
방법 B: wscat
커맨드라인 툴 사용
Node.js 기반의 wscat
은 간편한 커맨드라인 WebSocket 클라이언트입니다.
wscat
설치: Node.js와 npm을 먼저 설치한 후, 아래 명령으로 wscat을 전역 설치합니다.bashnpm install -g wscat
1WebSocket 서버 접속: 아래 명령으로 서버에 연결합니다.
bashwscat -c ws://localhost:9502
1연결 성공 시
>
프롬프트가 나타납니다.메시지 전송: 프롬프트에 메시지를 입력 후 엔터하면 서버에 전송됩니다.
bash> Hello ServBay via wscat
1서버에서 처리한 메시지 응답은
<
로 시작하는 줄에 표시됩니다:bash< Hello, you sent: Hello ServBay via wscat
1websocket_server.php
를 실행 중인 터미널에도 실시간 로그가 출력됩니다.
커넥션 종료 시 Ctrl + C
를 누르면 됩니다.
유의사항
- 포트 충돌: Swoole 서버가 사용하는 포트(예: 9501, 9502)가 다른 프로그램에 의해 점유되어 있지 않은지 반드시 확인하세요. 충돌 시 서버가 시작되지 않습니다.
- PHP 버전: 스크립트 실행 시 ServBay에서 Swoole이 활성화된 PHP 버전을 사용해야 합니다.
php -v
로 현재 CLI PHP 버전을 확인하세요. ServBay는 PHP 버전 전환을 쉽게 할 수 있는 도구도 제공합니다. - 확장 모듈 상태: 서버 실행이 실패한다면, 사용 중인 PHP 버전에 Swoole 모듈이 제대로 활성화되어 있고 ServBay/PHP 서비스를 재시작했는지 확인하세요.
- 상시 프로세스 관리: Swoole 서버는 메모리에 상시 상주하는 프로세스이므로, 운영 환경에선 Supervisor, Systemd, pm2 등으로 프로세스 관리와 자동 재시작을 구현해야 합니다. 로컬 개발에서는 터미널에서 직접 실행해도 충분합니다.
마무리
ServBay를 통해 Swoole 확장 모듈을 간편하게 활성화하고, 로컬 개발 환경에서 고성능 PHP 애플리케이션—전통적인 HTTP 서버는 물론, WebSocket 기반의 실시간 통신 서비스까지—를 쉽게 구현할 수 있습니다. Swoole의 강력한 기능과 ServBay의 편리함이 만나, PHP 개발자의 가능성을 확장하고 더 빠르고 강력한 앱 개발을 도와줍니다. 지금 ServBay에서 Swoole을 직접 사용해보세요!