php 로 소켓 프로그램 만들기 (다중 처리, 멀티스레드)

프로그래밍/PHP|2016. 10. 28. 17:17
반응형

- 본 예제는 client 의 연결을 자식 프로세스(thread) 로 구동시켜 여러 client 의 요청을 다중 처리하도록 하는 코드 입니다.

- 본 예제는 client 와 서버가 메세지를 한 번씩 주고 받는 예제 입니다.



1. 서버에서 데몬 생성


# vi server.php


#!/usr/local/php/bin/php -q

<?php

set_time_limit(0);


define("_IP",    "0.0.0.0");    // 접속 허용할 IP. 모든 IP 에 대하여 오픈할 경우 0.0.0.0 으로 설정

define("_PORT",  "81");


$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);


socket_bind($sSock, _IP, _PORT);

socket_listen($sSock);


pcntl_signal(SIGCHLD, SIG_IGN);


while($sock = socket_accept($sSock))

{

    socket_getpeername($sock, $sockIp, $sockPort);

    msg("\nclient connect : ".$sockIp.":".$sockPort."\n");


    $pid = pcntl_fork();

    if($pid == -1)

    {

        msg("fork failed\n");

        exit;

    }

    // 자식 프로세스 일때 

    if($pid == 0)

    {

        $buf = socket_read($sock, 4096);


        // 클라이언트에서 받은 데이타 처리하는 부분

        msg("recive data : ".$buf."\n");    // 클라이언트에게 받은 메세지

        msg("client(".$sockPort.") time data request\n");

        $re = "Complete launching server";    // 클라이언트에게 응답할 메세지

        socket_write($sock, $re);

        msg("client disconnect : ".$sockIp.":".$sockPort."\n");

        socket_close($sock);

        exit;

    }

}


function msg($msg)

{

    echo "SERVER >> ".$msg;

}

?>


실행 권한 부여 및 작성후 데몬 구동


# chmod 700 server.php

# ./server.php &




2. 클라이언트에서 접속 파일 생성


# vi client.php


#!/usr/local/php/bin/php -q

<?php

define("_IP",    "192.168.10.2");    // 접속할 서버 IP

define("_PORT",  "81");                // 접속할 서버 PORT


$sock      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($sock, _IP, _PORT);

msg("socket connect to "._IP.":"._PORT."\n");


// 서버로 보낼 데이타

$stdin = "time";

socket_write($sock, $stdin);

$sMsg  = socket_read($sock, 4096);


msg("result : ".$sMsg."\n");


socket_close($sock);

exit;


// 로그를 출력합니다. 디버그용

function msg($msg)

{

    echo "CLIENT >> ".$msg;

}

?>




3. 테스트


client 에서 생성한 client.php 파일을 실행합니다.


# ./client.php

# ./client_multi.php

CLIENT >> socket connect to 192.168.30.20:444

CLIENT >> result : Complete launching server


* 참고로 (client 접속 당시) 서버 콘솔에 출력된 메세지 입니다.


# SERVER >> client connect : 192.168.30.40:32966

SERVER >> recive data : time

SERVER >> client(32966) time data request



[참조하여 작성함] http://www.phpschool.com/class/php_multi_socket_server3.html

반응형

댓글()