2016-10-01 2 views
1

저는 PHP를 처음 사용하고 IRC 봇에서 채널을 조인하고 메시지를 보낸 다음 종료합니다.루프 동안이 PHP를 어떻게 깰 수 있습니까?

$ message를 보낸 후 (6 행)를 제외하고는 모두 스크립트에서 작동하지만 무한 루프를 종료하는 방법을 알지 못합니다.

// Open Internet connection 
$socket = fsockopen("$server", $port); 
fputs($socket,"USER $nick $nick $nick $nick :$nick\n"); 
fputs($socket,"NICK $nick\n"); 
fputs($socket,"JOIN ".$chan."\n"); 
fputs($socket, "PRIVMSG ".$chan." :$message1\n"); 


// Begin while loop 
while(1) { 
    while($data = fgets($socket)) { 
     echo nl2br($data); 
     flush(); 

     $ex = explode(' ', $data); 
     $channel = $ex[2]; 
     $nicka = explode('@', $ex[0]); 
     $nickb = explode('!', $nicka[0]); 
     $nickc = explode(':', $nickb[0]); 

     // $host = $nicka[1]; 
     $nick = $nickc[1]; 
     if($ex == "PING"){ 
      fputs($socket, "PONG ".$ex[1]."\n"); 
     } 

     $args = NULL; for ($i = 4; $i < count($ex); $i++) { $args .= $ex[$i] . ' '; } 

    } 
} 
+0

왜 두 개의 루프가 있습니까? – Jeff

+0

'break 2;'maybe? – bishop

답변

1

조건이 참일 때 중지되는 루프는 1 개만 있어야합니다. 당신이 소켓을 사용하면 동안이 필요 열어두고있는 경우

당신은 http://php.net/manual/en/control-structures.while.php

while(1) {  // <-- Remove the infinite loop 
    while($data = fgets($socket)) { 
0

를 읽을 수 있습니다. 이 문제를 해결하는 가장 좋은 방법은 콜백입니다. 그러나 당신이 단지 whiles를 깨고 싶다면.

// Open Internet connection 
$socket = fsockopen("$server", $port); 
fputs($socket,"USER $nick $nick $nick $nick :$nick\n"); 
fputs($socket,"NICK $nick\n"); 
fputs($socket,"JOIN ".$chan."\n"); 
fputs($socket, "PRIVMSG ".$chan." :$message1\n"); 


// Begin while loop 
all_data_received = False 
while(1) { 
while($data = fgets($socket)) { 
    echo nl2br($data); 
    flush(); 

    $ex = explode(' ', $data); 
    $channel = $ex[2]; 
    $nicka = explode('@', $ex[0]); 
    $nickb = explode('!', $nicka[0]); 
    $nickc = explode(':', $nickb[0]); 

    // $host = $nicka[1]; 
    $nick = $nickc[1]; 
    if($ex == "PING"){ 
     fputs($socket, "PONG ".$ex[1]."\n"); 
    } 

    $args = NULL; for ($i = 4; $i < count($ex); $i++) { $args .= $ex[$i] . ' '; 

    all_data_received = True //or some other conditions 

    } 

    if (all_data_received == True){ 
     break; 
     } 

} 
관련 문제