PHP¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½Å (2)

ÀÌÁø¿ì

ÇÁ¸®·£¼­
ÇÁ·Î±×·¡¸Ó

            
          


Â÷·Ê
1. ¼Ò°³
2. SELECT
2.1. socket_select() ÇÔ¼ö
3. ÇÁ·Î±×·¥ ÀÛ¼º
3.1. ¼­¹ö ¸¸µé±â
3.2. Ŭ¶óÀÌ¾ðÆ® ¸¸µé±â
3.3. ½ÇÇàÇϱâ
4. °á·Ð

À̹®¼­ÀÇ ¹èÆ÷´Â ÀÚÀ¯·Î¿ì³ª ÃÖ¼ÒÇÑ Á¦ÀÛÀÚÀÇ Á¤º¸´Â Á¦¿ÜÇÏÁö ¾Ê°í ¹èÆ÷ÇØ ÁÖ¼¼¿ä.

¹®¼­°¡ Á¸ÀçÇÏ´Â ¸ðµç°÷¿¡ ´äº¯À» µå¸±¼ö ¾øÀ¸¹Ç·Î Áú¹®Àº ȨÆäÀÌÁö(http://www.jinoos.com)¿¡¼­¸¸ ¹Þ½À´Ï´Ù.


1. ¼Ò°³

Àú¹ø°­ÁÂ(PHP¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½Å (1))¿¡ °£´ÜÇÑ ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥À» ¸¸µé¾î º¸¾Ò½À´Ï´Ù. ÇÏÁö¸¸ À̰ÍÀº ¸¹Àº ºÎºÐÀÌ ºÎÁ·ÇÏ´Ù´Â »ý°¢µéÀ» ÇϼÌÀ»²®´Ï´Ù.

¿À´Ã ½Ã°£¿¡´Â socket_select() ÇÔ¼ö¸¦ ÅëÇØ¼­ ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ® ¿äûÀ» ó¸®ÇÏ´Â ÇÁ·Î±×·¥À» Â¥ º¸°Ú½À´Ï´Ù.


2. SELECT

Àú¹ø°­ÁÂ(PHP¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½Å (1))ÀÇ server.php ¿¡¼­

while($cSock = socket_accept($sSock))
{
    $date = date("Y/m/d H:i:s");
    socket_write($cSock, $date);
    socket_close($cSock);
}

À§ÄÚµå´Â Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏÀÌ Á¢¼ÓÇϱ⸦ ´ë±âÇÏ´Â µ¿ÀÛÀÔ´Ï´Ù. ÇÏÁö¸¸ socket_accept()ÇÔ¼ö´Â È£ÃâµÈµÚ¿¡ ¼ÒÄÏ¿¬°á ¿äûÀÌ µé¾î¿À¸é ¿äû 󸮸¦ ÇÏ°Ô µË´Ï´Ù. ÇÁ·Î±×·¥ »ó¿¡¼± ¸Þ½ÃÁö¸¦ Àü¼ÛÇÏ°í °ð¹Ù·Î Ŭ¶óÀÌ¾ðÆ®¿Í ¼ÒÄÏÀ» Á¾·áÇÏ°í ´Ù½Ã accept »óÅÂ(blocking¸ðµå)·Î ÀüȯµÇ´Â ÇüÅÂÀÔ´Ï´Ù.

À̿Ͱ°Àº °æ¿ì´Â Á¢¼ÓµÈ Ŭ¶óÀÌ¾ðÆ®¿Í ¼ÒÄÏ Á¢¼ÓÀÌ ¹Ýµå½Ã ²÷¾îÁ®¾ß(¾Æ´Ï¸é ´ç¿¬È÷ ²÷¾î¾ß ÇÑ´Ù´øÁö) ´Ù¸¥ Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ó¸® ÇÒ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ ºÒ±ÔÄ¢ ÀûÀ¸·Î Ŭ¶óÀÌ¾ðÆ®°¡ ¼­¹ö¿¡ ¿äû(¼ÒÄÏÁ¢¼ÓÀÌ ¾Æ´Ô)À» ÇÏ´Â »óȲÀ̶ó¸é ¹®Á¦°¡ µÉ°ÍÀÌ ÀÚ¸í ÇÕ´Ï´Ù.

ÀÌ¿Í °°Àº »óȲÀ» ó¸® Çϱâ À§Çؼ­ ´Ù·®ÀÇ socket¹­À½À» µ¿½Ã¿¡ °¨½ÃÇÏ´Â SELECT°¡ ÀÖ½À´Ï´Ù. PHP¿¡¼­´Â socket_select() ÇÔ¼ö°¡ ¹Ù·Î ±×°ÍÀÔ´Ï´Ù.


2.1. socket_select() ÇÔ¼ö

int socket_select ( resource &read, resource &write, resource &except, int tv_sec [, int tv_usec] )

read ÀÎÀÚ¿¡´Â Àбâ À̺¥Æ®¸¦ °¨½ÃÇÒ Socket Array°¡ ÂüÁ¶µË´Ï´Ù. socket_select() ÇÔ¼ö´Â Array ¹­À½À¸·Î µé¾î¿À´Â ¼ÒÄϵéÀ» °¨½ÃÇÏ´Ù°¡ À̺¥Æ®°¡ ¹ß»ýÇϸé ÇØ´çÀÎÀÚ¸¦ Àбâ À̺¥Æ®°¡ ¹ß»ýÇÑ Socket Array·Î º¯È¯Çϰí Blocking »óŰ¡ ÇØÁ¦ µË´Ï´Ù.

write ÀÎÀÚ¿ª½Ã read ÀÎÀÚ¿Í °°Àº ¿ªÇÒ·Î ¾²±â À̺¥Æ®°¡ ¹ß»ýÇҽÿ¡ »ç¿ëµÈ´Ù.(ÇÏÁö¸¸. -_- ¾îµð¿¡ ÇÊ¿äÇÏ´Ü ¸»Àΰ¡. º»ÀÎÀº À̺κÐÀÌ ÀÌÇØ°¡ Àß ¾È°£´Ù. Ȥ½Ã ¾Ë°íÀÖ´Ù¸é ¾Ë·ÁÁֱ⠹ٶõ´Ù. except ¿ª½Ã º»ÀÎÀÌ »ç¿ë¹ýÀ» ¾Ë¾Æ³»Áö ¸øÇß´Ù.)

Áß¿äÇÑ ÀÎÀÚÀÎ tv_sec´Â select°¡ block ¸ðµå·Î ´ë±âÇϰí ÀÖ´Â timeoutÀ» ¼³Á¤ÇÕ´Ï´Ù. À̰ÍÀ» À¯¿ëÇÏ°Ô ÀÌ¿ëÇϸé ÀÏÁ¤°£°ÝÀ¸·Î ¾î¶°ÇÑ ÀÛ¾÷À» ¼öÇàÇϴ°͵µ °¡´ÉÇÕ´Ï´Ù. NULL·Î ¼³Á¤Çϸé timeout¾øÀÌ ´ë±â ÇÕ´Ï´Ù.


3. ÇÁ·Î±×·¥ ÀÛ¼º

ÀüÀå¿¡¼­ select ÇÔ¼ö¿¡ ´ëÇØ ¸î°¡Áö¸¦ ¾Ë¾Æ º¸¾Ò½À´Ï´Ù. ºÎÁ·ÇÏÁö¸¸ »ç¿ëÇϱ⿣ Å©°Ô ¹®Á¦°¡ ¾øÀ» °ÍÀÔ´Ï´Ù.

¿À´Ã ÀÛ¼ºÇÑ ÇÁ·Î±×·¥Àº Àú¹ø°­ÁÂ(PHP¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½Å (1)) ¿¡¼­ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥°ú ±â´ÉÀº °°Áö¸¸ ¾à°£ º¹ÀâÇÑ ÇüÅÂÀÔ´Ï´Ù.

¼­¹ö¼ÒÄÏÀ» »ý¼ºÇѵڿ¡ Ŭ¶óÀÌ¾ðÆ®¸¦ ´ë±âÇϰí, Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÇϸé Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏÀ» Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏ ¹­À½À¸·Î ÀúÀåÇѵڿ¡ °¨½ÃÇÕ´Ï´Ù. »õ·Î¿î Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÇÏ¸é ´Ù½Ã Å¬¶óÀÌ¾ðÆ® ¹­À½¿¡ ÀúÀåÇÏ°í °¨½Ã¸¦ ¹Ýº¹Çϸç, Ŭ¶óÀÌ¾ðÆ®¿¡¼­ time¶ó´Â ¸Þ½ÃÁö¸¦ ¼ö½ÅÇϸé ÇöÀç ½Ã°£À» ¹Ù·Î ¼Û½ÅÇϰí, quit¶ó´Â ¸Þ½ÃÁö¸¦ ¼ö½ÅÇϸé Ŭ¶óÀÌ¾ðÆ®¿Í Á¢¼ÓÀ» ²÷½À´Ï´Ù.


3.1. ¼­¹ö ¸¸µé±â

½ÃÀÛÄÚµå´Â Àú¹ø °­ÁÂ¿Í ¸¹ÀÌ ºñ½ÁÇÕ´Ï´Ù. ´Ù¸¸ ¹«ÇÑ ·çÇÁ¸¦ µ¹¸é¼­ ¼­¹ö ¼ÒÄϰú Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏ ¹­À½À» Array·Î »ý¼ºÇÏ¿© selectÀÇ Read À̺¥Æ®¸¦ °¨½ÃÇÕ´Ï´Ù.
...
while(1)
{
    $sockArr = array_merge(array($sSock), $cSock);
    if(socket_select($sockArr, $tWrite = NULL, $tExcept = NULL, _TIMEOUT) > 0)
    {
        ... (1)
    }
}
...
Write À̺¥Æ®¿Í Except À̺¥Æ®´Â ¹«½ÃÇϱâ À§Çؼ­ NULL ó¸® µÇ¾ú½À´Ï´Ù. timeoutÀº ÁÖ¾îÁ³Áö¸¸ º» ÇÁ·Î±×·¥¿¡¼± Å©°Ô ÀÇ¹Ì ¾ø´Â »óȲÀÔ´Ï´Ù.

À§ ÄÚµåÁß socket_select()¿¡¼­ À̺¥Æ®°¡ ¹ß»ýµÇ¸é $sockArr º¯¼ö¿¡ ¸®ÅÏµÈ Array¸¦ (1)¿¡¼­ ºÐ¼®ÇÕ´Ï´Ù.
        ...
        foreach($sockArr as $sock)
        {
            if($sock == $sSock)
            {
                ... // (2)
            }else
            {
                ... // (3)
            }
        }
        ...
¼­¹ö ¼ÒÄÏ¿¡ Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÀ» ¿äûÇßÀ»¶§ $sockArr¿¡ ¼­¹ö ¼ÒÄÏÀÌ ¸®Åϵ˴ϴÙ. ±×¸®ÇÏ¿© (2)¿¡¼­ Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏÀ» socket_accept()ÇÔ¼ö·Î Á¢¼ÓÀ» Çã¿ëÇÕ´Ï´Ù.

¸¸¾à ¸®ÅÏµÈ ¼ÒÄÏÀÌ ¼­¹ö ¼ÒÄÏÀÌ ¾Æ´Ï¶ó¸é Ŭ¶óÀÌ¾ðÆ®¿Í Åë½ÅÁßÀÎ ¼ÒÄÏÀÔ´Ï´Ù. ´ç¿¬ÇϰÚÁÒ. array_merge(array($sSock), $cSock) ·Î ¼­¹ö ¼ÒÄϰú Ŭ¶óÀÌ¾ðÆ® ¼Ò¸ä¸¸À» mergeÇßÀ¸´Ï±î¿ä.

(3)¿¡¼­´Â Ŭ¶óÀÌ¾ðÆ®¿¡¼­ º¸³»´Â Á¤º¸¸¦ ÀоîµéÀ̰í À̸¦ ºÐ¼®Çؼ­ ó¸® ÇÏ´Â ºÎºÐÀÌ µé¾î °©´Ï´Ù. À¯ÀÇÇØ¼­ ºÁ¾ß ÇÒ ºÎºÐÀº
                $buf = socket_read($sock, 4096);

                // Á¢¼Ó Á¾·á
                if(!$buf)
                {
                }
                // ¸Þ½ÃÁö ¼ö½Å À̺¥Æ®
                else
                {
                }
$buf ÀÇ ³»¿ëÀÌ ¾øÀ»¶§ Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÀ» Á¾·áÇÔÀ» ÀÇ¹Ì ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.

ÀÚ ±×·³ ÀÌÁ¦ ½ÇÁ¦ Äڵ带 º¸°Ú½À´Ï´Ù.

#!/home/dimeclub/www/bin/php/php -q
<?php
set_time_limit(0);

define("_IP",    "111.222.333.12");
define("_PORT",  "65000");
define("_TIMEOUT", 10);


$cSock = array();
$cInfo = array();
$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($sSock, _IP, _PORT);
socket_listen($sSock);

while(1)
{
    $sockArr = array_merge(array($sSock), $cSock);
    if(socket_select($sockArr, $tWrite = NULL, $tExcept = NULL, _TIMEOUT) > 0)
    {
        foreach($sockArr as $sock)
        {
            // Listen Çϰí ÀÖ´Â ¼­¹ö ¼ÒÄÏÀÏ °æ¿ì
            // »õ·Î¿î Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼ÓÀ» ÀǹÌ
            if($sock == $sSock)
            {
                $tSock = socket_accept($sSock);

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

                $cSock[$tSock] = $tSock;
                $cInfo[$tSock] = array('ip'=>$sockIp, 'port'=>$sockPort);

                msg("client connect : ".$sockIp.":".$sockPort."\n");
            }
            // Ŭ¶óÀÌ¾ðÆ® Á¢¼ÓÇØ ÀÖ´Â ¼ÒÄÏÁß ÇϳªÀϰæ¿ì
            // ÇØ´ç Ŭ¶óÀÌ¾ðÆ®¿¡¼­ À̺¥Æ®°¡ ¹ß»ýÇÔÀ» ÀǹÌ
            else
            {
                $buf = socket_read($sock, 4096);

                // Á¢¼Ó Á¾·á
                if(!$buf)
                {
                    exceptSocket(&$cSock, &$cInfo, $sock);
                    msg("client connection broken : ".$sockIp.":".$sockPort."\n");
                }
                // ¸Þ½ÃÁö ¼ö½Å À̺¥Æ®
                else
                {
                    msg("recive data : ".$buf."\n");
                    $thisSockInfo = $cInfo[$sock];
                    $cmd = substr($buf, 0, 4);
                    switch($cmd)
                    {
                        // ½Ã°£Àü¼Û
                        case "time":
                            msg("client(".$thisSockInfo['port'].") time data request\n");
                            socket_write($sock, date("Y/m/d H:i:s"));
                            break;

                        // Á¾·á
                        case "quit":
                            msg("client(".$thisSockInfo['port'].") quit request\n");
                            socket_write($sock, "quit");
                            socket_close($sock);
                            exceptSocket(&$cSock, &$cInfo, $sock);
                            break;
                        default:
                            msg("client(".$thisSockInfo['port'].") invalid command $cmd\n");
                            break;
                    }
                }
            }
        }
    }
}

function exceptSocket(&$sockSet, &$infoSet, $sock)
{
    unset($sockSet[$sock]);
    unset($infoSet[$sock]);
    // array_merge ÇÔ¼ö¿¡¼­ error ¹ß»ýÀ» ¸·±âÀ§ÇÑ Ã³¸®
    if(count($sockSet)==0)
    {
        $sockSet = array();
        $infoSet = array();
    }
}

function msg($msg)
{
    echo "SERVER >> ".$msg;
}
?>
server.php·Î ÀúÀåÇÕ´Ï´Ù. ¿ª½Ã ½ÇÇà±ÇÇÑÀº ÀÖ¾î¾ß °ÚÁö¿ä.


3.2. Ŭ¶óÀÌ¾ðÆ® ¸¸µé±â

Ŭ¶óÀÌ¾ðÆ® ¿ª½Ã ¸î°¡Áö¸¦ ¼öÁ¤ÇÏ¿© ½©¿¡¼­ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾Æ µéÀ̵µ·Ï ó¸®ÇÏ¿´½À´Ï´Ù.

Ŭ¶óÀÌ¾ðÆ®´Â ¼­¹ö¿Í ¼ÒÄÏÀ» ¿¬°áÇÑµÚ »ç¿ëÀÚÀÇ Å°ÀÔ·ÂÀ» ±â´Ù·È´Ù timeÀ» ÀԷ½à ¼­¹ö¿¡ time¸Þ½ÃÁö¸¦ Àü¼ÛÇϰí quitÀԷ½à ÇÁ·Î±×·¥À» Á¾·á ÇÕ´Ï´Ù. PHP CGI¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÀÚ Å°ÀÔ·ÂÀ» ¹Þ¾ÆµéÀÌ´Â ¿ªÇÒÀº ¾Æ·¡ ÇÔ¼öó·³ ±¸ÇöµÇ¾ú½À´Ï´Ù.
function read_data()
{
    $in = fopen("php://stdin", "r");
    $in_string = fgets($in, 255);
    fclose($in);
    return $in_string;
}
fopen("php://stdin", "r") ·Î ¿ø·¡ Àǹ̴ ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ fopen("/dev/stdin", "r"), fopen("/proc/self/fd/0", "r"), fopen("dev/fd/0", "r") ÀÔ´Ï´Ù. Ç¥ÁØÀÔ·ÂÀ» ¹Þ¾ÆµéÀÌ´Â ¿ªÇÒ·Î »ç¿ëÀÚ Å°ÀÔ·ÂÀ» ¹Þ¾ÆµéÀÌÁÒ.

¸¸¾à Ç¥ÁØÃâ·Â ¶Ç´Â Ç¥Ãâ¿¡·¯ Ãâ·ÂÀ» ¹Þ¾ÆµéÀÌ·Á¸é fopen("php://stdout","r"), fopen("php://stderr", "r") ·Î ±¸ÇöÇÒ¼ö ÀÖ½À´Ï´Ù.

Ŭ¶óÀÌ¾ðÆ®´Â time ¶ó´Â ¼­¹ö¿¡ ½Ã°£ µ¥ÀÌÅ͸¦ ¿äûÇÏ´Â ¸Þ½ÃÁö¿Í quit ¶ó´Â Á¾·á µÎ ¸Þ½ÃÁö¸¦ Á¦¿ÜÇϰí´Â ³ª¸ÓÁö´Â ¹«½ÃÇÕ´Ï´Ù. ÄÚµå»ó¿¡´Â invalid command (not send) ¶ó°í Ãâ·ÂÇÏÁö¸¸ ±×ÀÌ»óÀÇ ¾î¶°ÇÑ Çൿµµ ÇÏÁö ¾Ê°í ¹«½ÃÇØ ¹ö¸³´Ï´Ù.

#!/home/dimeclub/www/bin/php/php -q
<?php
define("_IP",    "111.222.333.12");
define("_PORT",  "65000");

$sock      = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, _IP, _PORT);
msg("socket connect to "._IP.":"._PORT."\n");

while(1)
{
    msg("Enter command time or quit : ");

    // »ç¿ëÀÚÀÇ ¸í·É¾î¸¦ ÀԷ¹޽À´Ï´Ù.
    $stdin = ereg_replace("\n|\r", "", read_data());
    $stdin = substr($stdin, 0, 4);
    
    // time ¶Ç´Â quit ¸Þ½ÃÁö ¸»°í´Â ¹«½Ã ÇÕ´Ï´Ù.
    if($stdin == "time" || $stdin == "quit")
    {
        msg("Input command : ".$stdin."\n");
    }else
    {
        msg("invalid command (not send) : ".$stdin."\n");
        continue;
    }

    socket_write($sock, $stdin);
    $sMsg  = socket_read($sock, 4096);
    if(substr($sMsg, 0, 4) == 'quit')
    {
        socket_close($sock);
        exit;
    }else
    {
        msg("recived data : ".$sMsg."\n");
    }
}

// Ç¥ÁØÀÔ·ÂÀ» ¹Þ¾Æ °ªÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö
function read_data()
{
    $in = fopen("php://stdin", "r");
    $in_string = fgets($in, 255);
    fclose($in);
    return $in_string;
}

// ·Î±×¸¦ Ãâ·ÂÇÕ´Ï´Ù. µð¹ö±×¿ë
function msg($msg)
{
    echo "CLIENT >> ".$msg;
}
?>

Ưº°È÷ ³­ÇØÇÑ ºÎºÐÀº ¾øÀ»²¨¶ó »ý°¢ÇÕ´Ï´Ù. ¿ª½Ã À§ ¼Ò½º¸¦ client.php·Î ÀúÀåÇÏ°í ½ÇÇà±ÇÇÑÀ» ÁÝ´Ï´Ù.


3.3. ½ÇÇàÇϱâ

¼­¹ö¸¦ ½ÇÇàÇϰí Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÇÇàÇÕ´Ï´Ù. Ŭ¶óÀ̾ðÆ®#1À» ½ÇÇàÈÄ time ¸Þ½ÃÁö¸¦ ³¯¸®¸é¼­ Ŭ¶óÀ̾ðÆ®#2 ½ÇÇàÈÄ Á¾·á, Ŭ¶óÀ̾ðÆ®#3 ½ÇÇàÈÄ Á¾·á, ±×¸®°í ´Ù½Ã Ŭ¶óÀ̾ðÆ®#1À» Á¾·á ÇÏ¿´½À´Ï´Ù.

Ŭ¶óÀ̾ðÆ®#1
#] ./client.php 
CLIENT >> socket connect to 111.222.333.12:65000
CLIENT >> Enter command time or quit : time
CLIENT >> Input command : time
CLIENT >> recived data : 2003/05/09 22:32:29
CLIENT >> Enter command time or quit : time
CLIENT >> Input command : time
CLIENT >> recived data : 2003/05/09 22:32:34
CLIENT >> Enter command time or quit : time
CLIENT >> Input command : time
CLIENT >> recived data : 2003/05/09 22:32:41
CLIENT >> Enter command time or quit : time
CLIENT >> Input command : time
CLIENT >> recived data : 2003/05/09 22:32:50
CLIENT >> Enter command time or quit : time
CLIENT >> Input command : time
CLIENT >> recived data : 2003/05/09 22:32:57
CLIENT >> Enter command time or quit : quit
CLIENT >> Input command : quit
#]

Ŭ¶óÀ̾ðÆ®#2,#3
#] ./client.php 
CLIENT >> socket connect to 111.222.333.12:65000
CLIENT >> Enter command time or quit : time
CLIENT >> Input command : time
CLIENT >> recived data : 2003/05/09 22:32:31
CLIENT >> Enter command time or quit : quit
CLIENT >> Input command : quit
#] ./client.php 
CLIENT >> socket connect to 111.222.333.12:65000
CLIENT >> Enter command time or quit : time
CLIENT >> Input command : time
CLIENT >> recived data : 2003/05/09 22:32:47
CLIENT >> Enter command time or quit : quit
CLIENT >> Input command : quit
#] 

°°Àº »óȲÀÇ ¼­¹öÂÊ ½ÇÇàÈ­¸éÀÔ´Ï´Ù.

#] ./server.php 
SERVER >> client connect : 111.222.333.12:32850        -- (4)
SERVER >> client connect : 111.222.333.12:32868        -- (5)
SERVER >> recive data : time
SERVER >> client(32850) time data request
SERVER >> recive data : time
SERVER >> client(32868) time data request
SERVER >> recive data : time
SERVER >> client(32850) time data request
SERVER >> recive data : quit                          
SERVER >> client(32868) quit request                  -- (6)
SERVER >> recive data : time
SERVER >> client(32850) time data request
SERVER >> client connect : 111.222.333.12:32938        -- (7)
SERVER >> recive data : time
SERVER >> client(32938) time data request
SERVER >> recive data : time
SERVER >> client(32850) time data request
SERVER >> recive data : quit             
SERVER >> client(32938) quit request                  -- (8)
SERVER >> recive data : time
SERVER >> client(32850) time data request
SERVER >> recive data : quit
SERVER >> client(32850) quit request                  -- (9)

(4)¿¡¼­ Ŭ¶óÀÌ¾ðÆ®Æ÷Æ® 32850, (5)¿¡¼­ 32868 ÀÌ·¸°Ô µÎ°³ÀÇ Å¬¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÇß½À´Ï´Ù. ¼­¹ö´Â µÎ°³ÀÇ Å¬¶óÀÌ¾ðÆ®¿¡¼­ time ¸Þ½ÃÁö¸¦ ¼ö½ÅÇϸ鼭 µ¿ÀÛÇÏ´Ù (6)¿¡¼­ ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÀ» Á¾·áÇϰí (7)¿¡¼­ ´Ù½Ã ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®°¡ 32938 Ŭ¶óÀÌ¾ðÆ® Æ÷Æ®·Î ´Ù½Ã Á¢¼ÓÇß½À´Ï´Ù. ±×¸®°í ´Ù½Ã time ¸Þ½ÃÁö¸¦ ÁÖ°í ¹Þ´Ù (8)¿¡¼­ ÇϳªÀÇ Å¬¶óÀÌ¾ðÆ®°¡ ÅðÀåÇÏ°í ±×¸®°í (9)¿¡¼­ ¸¶Áö¸· Ŭ¶óÀÌ¾ðÆ® ±îÁö Á¾·á µÇ¾ú½À´Ï´Ù.

32850, 32868 ±×¸®°í 32938ÀÌ °¢°¢ Ŭ¶óÀÌ¾ðÆ® #1, #2, #3 ÀÔ´Ï´Ù.


4. °á·Ð

¿À´ÃÀº SELECT¶ó´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¼ÒÄÏ ¿¬°á ¼­¹ö¸¦ ¸¸µé¾î º¸¾Ò½À´Ï´Ù. SELECT´Â °£´ÜÇÑ ±¸Á¶¿¡¼­ ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ¹Þ¾ÆµéÀϼö ÀÖ´Â ¹æ¹ýÀ¸·Î ÀÌ¿ëµË´Ï´Ù. ¶ÇÇÑ SELECT ±â´ÉÀº ´ÜÀϼÒÄÏ¿¬°áÀÇ timeout ±¸Çö¿¡µµ »ç¿ëÇÒ¼ö Àִµ¥ À̰ÍÀº ¿©·¯ºÐµéÀÌ ÇØº¸½Ã±â ¹Ù¶ø´Ï´Ù.

´ÙÀ½ °­Á¿¡¼­´Â PHPÀÇ Process Control FunctionsÀ» ÀÌ¿ëÇØ¼­ Fork¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½ÅÀ» ÇØº¸°Ú½À´Ï´Ù.