2012-11-06 2 views
0

이 PhP 스크립트는 긴 폴링에 대한 합법적 인 접근 방법입니까, 아니면 서버에서 무거울 것입니까?합법적 인 긴 폴링 방식입니까?

$FoundNewContent = false; 

$tokens = array(); 

while(!$FoundNewContent) { 
    usleep(300000); 
    clearstatcache(); 
    $SQL1 = "SELECT * FROM tokens WHERE ID > ".$_GET['tokenID']; 
    $result1 = mysql_query($SQL1); 
    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) { 
     array_push($tokens, $row1); 
     $FoundNewContent = true; 
    } 
} 

// Parse XML array  

flush() 

이 스크립트는 Ajax를 통해 호출합니다.

+0

당신은 아무것도하지 않습니다. 그 후에는 홍조를 피우고 있습니다. 출력은 무엇입니까? 그냥 비어 있니? –

+0

while 루프와 플러시 사이에 실제로 jQuery에서 처리되는 xml 배열을 구문 분석합니다. – matteok

+0

올바르게 표시되지 않습니까? 내 말은 ... 확실하지 않다 ... –

답변

1

서버 설정에 따라 다릅니다. 세션을 사용하지 않는 한 정상적으로 작동하지만 한 번에 너무 많은 연결로 인해 서버가 작동하지 않을 수 있습니다.

또한 아무것도 반환하지 않는 시간 제한을 추가하고 폴링을 다시 시작합니다. 그렇지 않으면 데이터가 추가되지 않고 서버 시간 초과가 무제한으로 설정된 경우 스크립트는 영원히 실행될 수 있습니다. 보통 30 초 제한을 추가합니다. 같은

뭔가 : $ FoundNewContent`가 'TRUE'인`경우

$FoundNewContent = false; 
$tokens = array(); 
$time = time(); 
while(!$FoundNewContent) { 
    usleep(300000); 
    clearstatcache(); 
    $SQL1 = "SELECT * FROM tokens WHERE ID > ".$_GET['tokenID']; 
    $result1 = mysql_query($SQL1); 
    while($row1 = mysql_fetch_array($result1, MYSQL_ASSOC)) { 
    array_push($tokens, $row1); 
    $FoundNewContent = true; 
    } 
    if($time<time()-30) break; 
} 
flush() 
+0

과 같은 것을 사용하면 "session_start()"와 같은 세션을 의미합니까? 그렇다면 사용하고 있습니다. – matteok

+0

예 - session_start()를 사용하면 loop 이전에 session_write_close()를 실행해야한다는 것이 제 경험입니다. 그렇지 않으면 스크립트가 중단됩니다. session_write_close()는 세션에서 내용을 변경하지 못하도록하기 때문에 그렇게하기 전에 session_start()를 사용하고, 그렇게하기 전에 session_write_close()를 다시 사용하십시오. – smokiespartakus

+0

그래서 한 번에 약 10 ~ 15 명의 클라이언트가 30 ~ 45 개의 mysql SELECT 요청을하는 폴링 컨텐츠를 가지고 있다면 걱정할 필요가 없을 것입니다. – matteok

관련 문제