PHP를 통해 웹 소켓을 하기 위해선 소켓 서버가 있어야한다. 당연하게도 우리는 웹 소켓 프로그램을 만들기엔 오랜시간이 걸리고 어쩌면 영영 못만들 수 있다. 그래서 제공되는 라이브러리를 사용해야 하며 라이브러리는 Composer를 통해 쉽게 관리할 수 있다.
우선 들어가기 앞서 Composer 설치가 안되어 있을 경우 진행할 수 없으니 사전에 Composer를 설치하기 바란다.
# composer --version
만약 composer 를 찾을 수 없을 경우에는 아래의 사이트들을 참고하여 composer를 설치한다.
가장 먼저 Ratchet 라이브러리를 설치할 경로를 생성한다. (한줄 씩 실행하면 되고 #은 명령어 구분자)
# mkdir library
# cd library
# mkdir Ratchet
# cd Ratchet
# vi composer.json
편집기가 열리면 아래의 설정 내용을 추가한다.
{
"autoload": {
"psr-4": {
"MyApp\\": "src"
}
},
"require": {
"cboden/ratchet": "^0.4.4"
}
}
그다음 composer 명령어를 통해 install 한다.
# composer install
실행 후 보면 vendor와 composer.lock 파일이 생성된것을 확인할 수 있다. 그럼 이제 실제 소켓 통신 실행 파일과 처리 파일을 생성해 보자. 우선 처리 파일을 먼저 생성해보자.
# mkdir src
# cd src
# vi Chat.php
편집기가 열리면 아래의 소스코드를 추가한다.
<?php # 파일경로: /library/Ratchet/src/Chat.php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface{
// 생성자
public function __construct() {
}
// 유저 접속 시
public function onOpen(ConnectionInterface $conn)
{
}
// 메세지 수신
public function onMessage(ConnectionInterface $from, $msg)
{
}
// 소켓 종료 시
public function onClose(ConnectionInterface $conn)
{
}
// 소켓 에러 시
public function onError(ConnectionInterface $conn, \Exception $e)
{
}
}
그다음 library 디렉토리가 있는 루트 디렉토리로 이동하여 실행파일 run.php를 생성한다.
# vi RatchetRun.php
편집기를 통해 아래의 소스코드를 추가한다.
<?php # 경로: /RatchetRun.php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat; // src/Chat.php 파일 참고
// Ratchet의 autoload.php 파일 경로
require __DIR__ . '/library/Ratchet/vendor/autoload.php';
define('PORT', 4343);
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
PORT
);
echo "웹 소켓 실행(PORT: ".PORT.")\n";
$server->run();
이렇게 해서 Ratchet 라이브러리 설치가 완료되었다. 그럼 실행하는 방법에 대해 알아보도록 하자.
웹 소켓 서버실행은 서버에서 아래와 같이 PHP 명령어를 통해 실행 가능하다.
# php RatchetRun.php
실행하고 나면 아래와 같이 해당 파일에 echo 로 출력한 내용이 보여진다.
만약 아래와 같이 Invalid URI 오류가 발생된다면 iptables 에서 포트를 열어주어야 한다.
iptables 에서 포트를 여는 방법은 아래와 같으나 본 서버 OS는 Centos7 이기에 다른 OS의 경우 위치 및 실행 방법이 다를 수 있으니 참고 바란다. (root 로 접속하여 실행)
# vi /etc/sysconfig/iptables
편집기가 열리면 아래의 내용을 기입한다. (예제에 사용할 포트는 4343)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4343 -j ACCEPT
참고) 만약 포트를 다수개 열고 싶다면 아래와 같이 포트 내역대로 지정해 준다. 아래는 4000번대 부터 9000번대 까지 설정한 예제이니 참고 바란다.
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4000:9000 -j ACCEPT
그다음 iptables 를 재시작 해준다.
# systemctl restart iptables
만약 실행된 웹 소켓을 종료하고 싶다면 키보드에서 ctrl + c 를 누르면 종료가 되며 소켓도 즉시 끊어진다. 만약 소켓이 계속 살아 있을 경우에는 아래의 명령어를 통해 끊어 주면 된다.
# fuser -k 4343
# lsof -i :4343
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 25390 root 3u IPv4 73062756 0t0 TCP redinfo.co.kr:pharos (LISTEN)
위에서 보면 PID가 25390인것을 확인 할 수 있다. 아래와 같이 kill 명령어를 통해 열린 포트를 죽일 수 있다.
# kill 25390
여기까지 하여 PHP의 Ratchet 라이브러리를 설치하고 웹 소켓 서버를 실행 및 종료하는 방법까지 알아 보았다. 다음 편에서는 웹 소켓을 통해 실제 연결하고 데이터를 주고 받는 방법에 해대 알아보도록 하자.