PHP를 통해 웹 소켓을 하기 위해선 소켓 서버가 있어야한다. 당연하게도 우리는 웹 소켓 프로그램을 만들기엔 오랜시간이 걸리고 어쩌면 영영 못만들 수 있다. 그래서 제공되는 라이브러리를 사용해야 하며 라이브러리는 Composer를 통해 쉽게 관리할 수 있다. 

 

우선 들어가기 앞서 Composer 설치가 안되어 있을 경우 진행할 수 없으니 사전에 Composer를 설치하기 바란다. 

| 참고 - Composer 가 설치되어있는지 체크 (버전을 체크)
# composer --version

만약 composer 를 찾을 수 없을 경우에는 아래의 사이트들을 참고하여 composer를 설치한다.

 
CentOS 7 : PHP Composer 설치, 사용하는 방법, 예제, 명령어
Composer는 PHP(Node.js의 경우 npm 또는 Python의 경우 pip과 유사함)의 종속성 관리자입니다. Composer는 프로젝트가 의존하는 모든 필수 PHP 패키지를 가져와 관리합니다. 그것은 라라벨, 심포니, 드루팔 그리고 마그넨토 2와 같은 모든 현대 PHP 프레임워크와 플랫폼에 사용됩니다. 이 튜토리얼에서는 CentOS 7 시스템에 Composer를 설치하고 사용하는 단계를 살펴보겠습니다. 필수 조건 이 튜토리얼을 계속하기 전에 다음 필수 구성 요소를 충족했는지 확인하십시오. - sudo 권한을 가진 사용자로 로그인했습니다. - CentOS 7에 PHP 7을 설치합니다. CentOS에 Composer 설치 다음 단계에서는 CentOS 7 시스템에 Composer를 설치하는 방법을 ..
https://jjeongil.tistory.com/1371

 

 
Linux(CentOS)에 composer(컴포저) 설치 하기
1. 개요 2. 설치 3. 확인 4. 마무리 1. 개요 지금 composer(컴포저)를 설치하는 이유는 라라벨 프레임워크 구동을 위한 준비과정입니다. 라라벨을 위해서 composer는 선택이 아닌 필수거든요. 이번에는 리눅스 서버에 설치해보도록 하겠습니다. * 리눅스 XAMPP 설치 글 : 2021/02/02 - [도구/XAMPP (APM)] - Linux(CentOS) 환경에 XAMPP 설치하기 (PHP 개발환경 준비) 2. 설치 - shell을 통해 서버에 접근한 상태에서 아래 명령어를 입력해줍니다. 명령어 입력 위치는 크게 중요하지 않습니다. curl -sS https://getcomposer.org/installer | php - 그러면 위와 같이 설치가 진행되고, composer.phar 파일이..
https://squareinven.tistory.com/51

 

Composer 를 통한 Ratchet 라이브러리 설치 

가장 먼저 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
※ 참고로 실행시 Warning 이 뜨는데 이는 무시하면 되고, 설치가 조금 오래 걸리니 기다리기 바란다. 

 

실행 후 보면 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 로 출력한 내용이 보여진다. 

웹 소켓 실행(PORT: 4343)

 

만약 아래와 같이 Invalid URI 오류가 발생된다면 iptables 에서 포트를 열어주어야 한다. 

Uncaught InvalidArgumentException: Invalid URI "tcp://0.0.0.0:4343" given (EINVAL) in /library/Ratchet/vendor/react/socket/src/TcpServer.php:157

 

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
참고)  혹시나 위의 명령어가 안될 경우 아래의 방법을 통해 kill 로 처리하면된다. 
# 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 라이브러리를 설치하고 웹 소켓 서버를 실행 및 종료하는 방법까지 알아 보았다. 다음 편에서는 웹 소켓을 통해 실제 연결하고 데이터를 주고 받는 방법에 해대 알아보도록 하자.