À̹®¼ÀÇ ¹èÆ÷´Â ÀÚÀ¯·Î¿ì³ª ÃÖ¼ÒÇÑ Á¦ÀÛÀÚÀÇ Á¤º¸´Â Á¦¿ÜÇÏÁö ¾Ê°í ¹èÆ÷ÇØ ÁÖ¼¼¿ä.
¹®¼°¡ Á¸ÀçÇÏ´Â ¸ðµç°÷¿¡ ´äº¯À» µå¸±¼ö ¾øÀ¸¹Ç·Î Áú¹®Àº ȨÆäÀÌÁö(http://www.jinoos.com)¿¡¼¸¸ ¹Þ½À´Ï´Ù.
Àú¹ø°ÁÂ(PHP¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½Å (1))¿¡ °£´ÜÇÑ ¼¹ö/Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥À» ¸¸µé¾î º¸¾Ò½À´Ï´Ù. ÇÏÁö¸¸ À̰ÍÀº ¸¹Àº ºÎºÐÀÌ ºÎÁ·ÇÏ´Ù´Â »ý°¢µéÀ» ÇϼÌÀ»²®´Ï´Ù.
¿À´Ã ½Ã°£¿¡´Â socket_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() ÇÔ¼ö°¡ ¹Ù·Î ±×°ÍÀÔ´Ï´Ù.
read ÀÎÀÚ¿¡´Â Àбâ À̺¥Æ®¸¦ °¨½ÃÇÒ Socket Array°¡ ÂüÁ¶µË´Ï´Ù. socket_select() ÇÔ¼ö´Â Array ¹À½À¸·Î µé¾î¿À´Â ¼ÒÄϵéÀ» °¨½ÃÇÏ´Ù°¡ À̺¥Æ®°¡ ¹ß»ýÇϸé ÇØ´çÀÎÀÚ¸¦ Àбâ À̺¥Æ®°¡ ¹ß»ýÇÑ Socket Array·Î º¯È¯Çϰí Blocking »óŰ¡ ÇØÁ¦ µË´Ï´Ù.
write ÀÎÀÚ¿ª½Ã read ÀÎÀÚ¿Í °°Àº ¿ªÇÒ·Î ¾²±â À̺¥Æ®°¡ ¹ß»ýÇҽÿ¡ »ç¿ëµÈ´Ù.(ÇÏÁö¸¸. -_- ¾îµð¿¡ ÇÊ¿äÇÏ´Ü ¸»Àΰ¡. º»ÀÎÀº À̺κÐÀÌ ÀÌÇØ°¡ Àß ¾È°£´Ù. Ȥ½Ã ¾Ë°íÀÖ´Ù¸é ¾Ë·ÁÁֱ⠹ٶõ´Ù. except ¿ª½Ã º»ÀÎÀÌ »ç¿ë¹ýÀ» ¾Ë¾Æ³»Áö ¸øÇß´Ù.)
Áß¿äÇÑ ÀÎÀÚÀÎ tv_sec´Â select°¡ block ¸ðµå·Î ´ë±âÇϰí ÀÖ´Â timeoutÀ» ¼³Á¤ÇÕ´Ï´Ù. À̰ÍÀ» À¯¿ëÇÏ°Ô ÀÌ¿ëÇϸé ÀÏÁ¤°£°ÝÀ¸·Î ¾î¶°ÇÑ ÀÛ¾÷À» ¼öÇàÇϴ°͵µ °¡´ÉÇÕ´Ï´Ù. NULL·Î ¼³Á¤Çϸé timeout¾øÀÌ ´ë±â ÇÕ´Ï´Ù.
ÀüÀå¿¡¼ select ÇÔ¼ö¿¡ ´ëÇØ ¸î°¡Áö¸¦ ¾Ë¾Æ º¸¾Ò½À´Ï´Ù. ºÎÁ·ÇÏÁö¸¸ »ç¿ëÇϱ⿣ Å©°Ô ¹®Á¦°¡ ¾øÀ» °ÍÀÔ´Ï´Ù.
¿À´Ã ÀÛ¼ºÇÑ ÇÁ·Î±×·¥Àº Àú¹ø°ÁÂ(PHP¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½Å (1)) ¿¡¼ ÀÛ¼ºÇÑ ÇÁ·Î±×·¥°ú ±â´ÉÀº °°Áö¸¸ ¾à°£ º¹ÀâÇÑ ÇüÅÂÀÔ´Ï´Ù.
¼¹ö¼ÒÄÏÀ» »ý¼ºÇѵڿ¡ Ŭ¶óÀÌ¾ðÆ®¸¦ ´ë±âÇϰí, Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÇϸé Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏÀ» Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏ ¹À½À¸·Î ÀúÀåÇѵڿ¡ °¨½ÃÇÕ´Ï´Ù. »õ·Î¿î Ŭ¶óÀÌ¾ðÆ®°¡ Á¢¼ÓÇÏ¸é ´Ù½Ã Å¬¶óÀÌ¾ðÆ® ¹À½¿¡ ÀúÀåÇÏ°í °¨½Ã¸¦ ¹Ýº¹Çϸç, Ŭ¶óÀÌ¾ðÆ®¿¡¼ time¶ó´Â ¸Þ½ÃÁö¸¦ ¼ö½ÅÇϸé ÇöÀç ½Ã°£À» ¹Ù·Î ¼Û½ÅÇϰí, quit¶ó´Â ¸Þ½ÃÁö¸¦ ¼ö½ÅÇϸé Ŭ¶óÀÌ¾ðÆ®¿Í Á¢¼ÓÀ» ²÷½À´Ï´Ù.
½ÃÀÛÄÚµå´Â Àú¹ø °ÁÂ¿Í ¸¹ÀÌ ºñ½ÁÇÕ´Ï´Ù. ´Ù¸¸ ¹«ÇÑ ·çÇÁ¸¦ µ¹¸é¼ ¼¹ö ¼ÒÄϰú Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏ ¹À½À» Array·Î »ý¼ºÇÏ¿© selectÀÇ Read À̺¥Æ®¸¦ °¨½ÃÇÕ´Ï´Ù.
...
while(1)
{
$sockArr = array_merge(array($sSock), $cSock);
if(socket_select($sockArr, $tWrite = NULL, $tExcept = NULL, _TIMEOUT) > 0)
{
... (1)
}
}
... |
À§ ÄÚµåÁß socket_select()¿¡¼ À̺¥Æ®°¡ ¹ß»ýµÇ¸é $sockArr º¯¼ö¿¡ ¸®ÅÏµÈ Array¸¦ (1)¿¡¼ ºÐ¼®ÇÕ´Ï´Ù.
...
foreach($sockArr as $sock)
{
if($sock == $sSock)
{
... // (2)
}else
{
... // (3)
}
}
... |
¸¸¾à ¸®ÅÏµÈ ¼ÒÄÏÀÌ ¼¹ö ¼ÒÄÏÀÌ ¾Æ´Ï¶ó¸é Ŭ¶óÀÌ¾ðÆ®¿Í Åë½ÅÁßÀÎ ¼ÒÄÏÀÔ´Ï´Ù. ´ç¿¬ÇϰÚÁÒ. array_merge(array($sSock), $cSock) ·Î ¼¹ö ¼ÒÄϰú Ŭ¶óÀÌ¾ðÆ® ¼Ò¸ä¸¸À» mergeÇßÀ¸´Ï±î¿ä.
(3)¿¡¼´Â Ŭ¶óÀÌ¾ðÆ®¿¡¼ º¸³»´Â Á¤º¸¸¦ ÀоîµéÀ̰í À̸¦ ºÐ¼®Çؼ ó¸® ÇÏ´Â ºÎºÐÀÌ µé¾î °©´Ï´Ù. À¯ÀÇÇØ¼ ºÁ¾ß ÇÒ ºÎºÐÀº
$buf = socket_read($sock, 4096);
// Á¢¼Ó Á¾·á
if(!$buf)
{
}
// ¸Þ½ÃÁö ¼ö½Å À̺¥Æ®
else
{
} |
ÀÚ ±×·³ ÀÌÁ¦ ½ÇÁ¦ Äڵ带 º¸°Ú½À´Ï´Ù.
#!/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;
}
?> |
Ŭ¶óÀÌ¾ðÆ® ¿ª½Ã ¸î°¡Áö¸¦ ¼öÁ¤ÇÏ¿© ½©¿¡¼ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾Æ µéÀ̵µ·Ï ó¸®ÇÏ¿´½À´Ï´Ù.
Ŭ¶óÀÌ¾ðÆ®´Â ¼¹ö¿Í ¼ÒÄÏÀ» ¿¬°áÇÑµÚ »ç¿ëÀÚÀÇ Å°ÀÔ·ÂÀ» ±â´Ù·È´Ù 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://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·Î ÀúÀåÇÏ°í ½ÇÇà±ÇÇÑÀ» ÁÝ´Ï´Ù.
¼¹ö¸¦ ½ÇÇàÇϰí Ŭ¶óÀÌ¾ðÆ®¸¦ ½ÇÇàÇÕ´Ï´Ù. Ŭ¶óÀ̾ðÆ®#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 ÀÔ´Ï´Ù.
¿À´ÃÀº SELECT¶ó´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¼ÒÄÏ ¿¬°á ¼¹ö¸¦ ¸¸µé¾î º¸¾Ò½À´Ï´Ù. SELECT´Â °£´ÜÇÑ ±¸Á¶¿¡¼ ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ¹Þ¾ÆµéÀϼö ÀÖ´Â ¹æ¹ýÀ¸·Î ÀÌ¿ëµË´Ï´Ù. ¶ÇÇÑ SELECT ±â´ÉÀº ´ÜÀϼÒÄÏ¿¬°áÀÇ timeout ±¸Çö¿¡µµ »ç¿ëÇÒ¼ö Àִµ¥ À̰ÍÀº ¿©·¯ºÐµéÀÌ ÇØº¸½Ã±â ¹Ù¶ø´Ï´Ù.
´ÙÀ½ °Á¿¡¼´Â PHPÀÇ Process Control FunctionsÀ» ÀÌ¿ëÇØ¼ Fork¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á ¼ÒÄÏ Åë½ÅÀ» ÇØº¸°Ú½À´Ï´Ù.