2010-08-16 3 views
1

나는 php와 ajax를 사용하여 채팅을했고, while 루프를 사용하여 데이터베이스에서 새 메시지를 확인했습니다. 이 채팅 스크립트는 효율적입니까?

메시지 검색하는 코드입니다 :

//retrive message 

function update(){ 

$(document).ready(function(){ 

$.ajax({ 

async: true, 

type: "POST", 

url: "listen.php", 

success: function(data){ 

$("#myp").before(data); 

}, 

complete: function(){ 

window.setTimeout("update();",100); 
} 

}); 

}); 

}; 


//wating for new message 

<?php 
include_once("connect.php"); 

$type=""; 

while($type!=='n'){ 


usleep(1000); 

$search=mysql_query("SELECT * from chat ORDER BY id DESC LIMIT 1"); 

$row=mysql_fetch_assoc($search); 

$type=$row['type']; 

$id=$row['id']; 

} 

echo $row['message'] . "<br/>"; 


mysql_query("UPDATE chat SET type='o' WHERE id=$id"); 


?> 

지금은 잘 작동을, PHP 파일은 지속적으로 새 메시지가있는 경우 페이지가로드 기다립니다 될 때 업데이트 기능이 시작 확인합니다 응답을 위해. 하지만 효율적입니까? 내가 이것을 웹 사이트에서 사용한다면, while 루프 때문에 서버에 너무 많은 스트레스를 가할까 봐 걱정된다. 누군가가 방법을 알고 루프를 서버에보다 친숙하게 만드는 동안 만들 수 있습니까?

답변

1

직감이 정확합니다. 일반적인 서버 설정은 초당 100-1000 건의 PHP 요청에 응답 할 수 있으므로 클라이언트 당 초당 10 건의 요청을 처리하면 서버에 개의 리소스가 가득 채워집니다. 그것은 소수의 사람들을 위해 창조 할 수 있지만, 잘 확장되지는 않습니다. 귀하의 서버는 10-100 명 사이의 어느 곳에서나 사용할 수 있습니다 (다소 낮습니다).

하나의 해결 방법은 각 서버 폴링 사이의 시간을 늘리는 것이지만, 이는 선형 수정일 뿐이며 사용자의 경험을 저하시킵니다.

더 나은 해결책은 comet 접근 방법을 사용하는 것입니다. PHP로 순전히하는 것은 어렵지 않습니다. 불가능하기 때문에 긴 HTTP 요청을 처리하기 위해 일부 외부 API를 처리해야합니다.

+0

감사합니다. 그러나 나는 혜성이 정확히 무엇인지 이해하지 못합니다. 어디에서 더 읽을 수 있습니까? 왜냐하면 나는 무엇을 찾고 있는지 정확히 모르기 때문에 구글은 정말로 도움이되지 않는다. – nope

+0

@Petre Comet은 클라이언트가 서버에 연결하여 서버가 클라이언트에 데이터를 보낼 준비가 될 때까지 수신 대기합니다. 이를 통해 일종의 "2-way"의사 소통이 가능합니다. 일반적으로 HTTP는 편도 (클라이언트 -> 서버)이지만 Comet은 서버가 클라이언트에 이벤트를 푸시 할 수있게합니다. 각 연결에는 PHP 프로세스 (램 오버 헤드로 인해 매우 제한적 임)가 필요하기 때문에 PHP를 사용하는 것이 다소 어렵습니다. 이것이 타사 혜성 서버를 조사하는 것이 더 좋은 이유입니다. 그는 예입니다. http://github.com/mcarter/hookbox/tree/master/examples/php_simple_chat/ –

관련 문제