ServBay에서 Swoole로 고성능 PHP 애플리케이션 구축하기
ServBay는 개발자를 위해 설계된 로컬 웹 개발 환경으로, 다양한 언어 환경과 데이터베이스, 각종 도구들을 사전 통합하여 로컬 개발을 더욱 간소화해줍니다. 본 문서에서는 ServBay 환경에서 Swoole 확장을 활용해 PHP 애플리케이션에 고성능 네트워크 서비스를 추가하는 방법을 중점적으로 다룹니다.
Swoole이란?
Swoole은 PHP를 위해 설계된 코루틴(coroutine) 기반의 병렬·고성능 네트워크 커뮤니케이션 엔진입니다. 순수 C 언어로 작성되었으며, PHP에 비동기·병렬·코루틴 네트워크 기능을 제공합니다. Swoole을 이용하면, 전통적인 웹 서버(예: Apache/Nginx + PHP-FPM) 요청-응답 모델의 한계를 넘어서, 높은 동시성을 필요로 하는 작업—예를 들어, 상주형 웹 서버, 비동기 작업처리, 실시간 통신 서비스(WebSocket 등)—를 더욱 효과적으로 처리할 수 있습니다.
Swoole의 주요 특징:
- 고성능: C 언어 기반의 비동기 I/O 및 다중 프로세스/스레드 지원
- 코루틴: 동기식 코드처럼 작성하면서도 비동기 방식의 실행이 가능해 비동기 프로그래밍이 쉬워짐
- 풍부한 프로토콜 지원: TCP/UDP/HTTP/WebSocket 등 다양한 네트워크 프로토콜 지원
- 간편한 사용: PHP 개발자에게 익숙한 직관적 API 제공
- 상주형 프로세스: 애플리케이션이 상주 프로세스로 동작하여, 매 요청마다 환경을 초기화하는 기존 PHP 방식의 오버헤드를 제거
Swoole 덕분에 PHP는 더 이상 단순한 웹 스크립트 언어가 아닌, 폭넓은 고성능 네트워크 애플리케이션 개발을 위한 강력한 플랫폼이 될 수 있습니다.
ServBay에서 Swoole 활성화하기
ServBay의 또 다른 핵심 목표는, 각종 PHP 확장을 쉽게 관리하고 사용할 수 있도록 하는 것입니다. Swoole은 현대 PHP 고성능 개발에 필수적인 확장으로, ServBay에 기본 탑재되어 있습니다. 단 몇 단계만으로 곧바로 사용할 수 있습니다.
사전 조건:
- ServBay가 설치 및 실행되어 있음
- ServBay에 최소 한 개 이상의 PHP 버전이 설치되어 있음
활성화 방법:
- ServBay 애플리케이션을 실행합니다.
- '패키지(Packages)' 또는 PHP 버전 관리 섹션으로 이동합니다. (참고: 사용 중인 ServBay 버전에 따라 메뉴 이름이 다를 수 있지만, 보통 메인 화면 또는 설정에서 찾을 수 있습니다)
- Swoole을 활성화할 PHP 버전을 선택합니다.
- Swoole 확장 옵션을 찾아 체크박스로 활성화합니다. ServBay는 활성화 가능한 확장 목록을 스위치 형태 또는 리스트로 제공합니다.
- 변경 사항을 저장하고, 안내에 따라 ServBay 또는 해당 PHP 서비스를 재시작합니다. ServBay가 PHP 환경을 자동으로 재구성하여 Swoole 확장을 로딩합니다.
위 과정을 마치면 선택한 PHP 버전 안에서 Swoole을 사용할 준비가 된 것입니다. 커맨드라인에서 php -m
을 실행하여, 확장 목록에 swoole
이 포함되어 있는지 확인할 수 있습니다.
TIP
ServBay는 웹사이트 및 프로젝트 파일을 /Applications/ServBay/www
경로에 보관할 것을 권장합니다. 이 경로를 이용하면 사이트 관리와 자동 설정이 더 쉬워집니다. 따라오는 예시에서도 이 경로를 사용하겠습니다.
Swoole HTTP 서버 간단 예제
이제 기본적인 Swoole HTTP 서버를 만들어, 실제로 웹 요청을 처리하는 방법을 보여드리겠습니다.
1단계: 프로젝트 디렉터리 생성하기
터미널을 열고, ServBay가 권장하는 /Applications/ServBay/www
위치에 새 프로젝트 폴더를 생성 및 이동합니다.
bash
cd /Applications/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 등 정보를 기록할 수 있습니다
});
// '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 서버를 만듭니다. 기본적으로 "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 서버 스크립트 작성
/Applications/ServBay/www/servbay-swoole-http
(또는 servbay-swoole-websocket
등의 새 폴더)에서, websocket_server.php
파일을 만들어 아래 코드를 입력하세요:
php
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// Swoole WebSocket 서버 인스턴스 생성
// WebSocket 서버는 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' 이벤트 등록
// 서버가 클라이언트로부터 WebSocket 메시지를 수신하면 실행
// $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 서버 실행
터미널에서 해당 파일이 있는 위치에서, Swoole이 활성화된 ServBay의 PHP로 아래 명령어를 실행합니다:
bash
php websocket_server.php
1
정상적으로 실행되면 터미널에 다음 메시지가 표시됩니다:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
이로써 WebSocket 서버가 9502 포트에서 정상 대기 중입니다.
3단계: WebSocket 서버에 연결하기
다양한 테스트 방법이 있습니다.
방법 A: 브라우저 개발자 도구 활용
대부분의 최신 브라우저 개발자 도구(보통 F12로 실행)의 '네트워크(Network)' 또는 '콘솔(Console)' 탭에서 WebSocket 기능을 테스트할 수 있습니다.
브라우저에서 웹페이지(예:
about:blank
)를 엽니다.개발자 도구를 열고 '콘솔(Console)'로 이동합니다.
아래 JavaScript 코드를 콘솔에 입력합니다:
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
커맨드라인 툴 사용
wscat
은 Node.js 기반 CLI용 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
1그리고
websocket_server.php
가 실행 중인 터미널에도 로그가 남습니다.
연결을 끊으려면 Ctrl + C
를 누르시면 됩니다.
참고 및 주의사항
- 포트 충돌: Swoole 서버가 사용할 포트(9501, 9502 등)가 이미 다른 애플리케이션에 의해 사용되고 있지 않은지 확인하세요. 포트 충돌 시 Swoole 서버가 구동되지 않습니다.
- PHP 버전: 터미널에서 PHP 스크립트를 실행할 때 ServBay에서 Swoole이 활성화된 PHP 버전을 사용해야 합니다.
php -v
로 현재 PHP 버전을 확인하고, ServBay에서는 손쉽게 버전 변경이 가능합니다. - 확장 상태: 서버가 정상적으로 시작되지 않는다면, Swoole 확장이 ServBay 내 해당 PHP 버전에서 제대로 활성화되어 있는지, 환경 재시작이 되었는지 재차 확인하세요.
- 상주형 프로세스 관리: Swoole 서버는 상시 백그라운드에서 동작합니다. 실제 운영환경에서는 Supervisor, Systemd, pm2처럼 프로세스 관리 도구로 자동 재시작 설정이 필요합니다. 로컬 개발 목적이라면 터미널에서 직접 실행해도 충분합니다.
마무리
ServBay를 통해 Swoole 확장을 매우 쉽게 활성화하고 사용할 수 있으며, 로컬 개발 환경에서도 고성능 PHP 애플리케이션의 구축과 실시간 WebSocket 서비스 개발이 가능합니다. Swoole의 강력함과 ServBay의 개발 편의성이 결합되어, PHP 개발자들에게 효율적이고 강력한 애플리케이션 구축의 새로운 가능성을 열어줍니다. ServBay에서 Swoole을 직접 경험하며 PHP 프로젝트의 성능을 극대화해보세요!