2014-04-14 6 views
-1

사용자를위한 새로운 메시지 알림을 실현하도록 도와주세요.새 메시지에 대한 알림. 긴 폴링

function getmess(){ 
$.ajax({ 
    url:"notif.php", 
    data:{"id":id}, 
    type:"GET", 
    success:function(result){ 
     $("#count").html(result); 
     setTimeout('getmess',10000); 
    } 
    }); 
} 

이 서버 코드 : 새 메시지가 데이터베이스에 추가 할 때 나는이 스크립트가 실시간으로 업데이트되지 않는 문제가

$mysqli = new mysqli('localhost', 'root', '', 'test'); 
if (mysqli_connect_errno()) { 
    printf("error: %s\n", mysqli_connect_error()); 
    exit; 
} 

session_start(); 

$MY_ID = $_SESSION['id']; 

while (true) { 
$result = $mysqli->query("SELECT COUNT(*) FROM messages WHERE user_get='$MY_ID'"); 
if (mysqli_num_rows($result)) { 
while ($row = mysqli_fetch_array($result)) { 
echo $row[0].""; 
} 
flush(); 
exit; 
} 
sleep(5); 
} 

지금 나는이 클라이언트 코드가 . 하지만 onclick = "getmess();"버튼을 누르면 그것은 작동합니다.

+0

를보십시오. 그렇다면 코드는 어디에 있습니까? 그리고 너의 질문? – Stony

+0

코드를 업데이트했습니다. – user3140144

답변

0

먼저 데이터베이스를 5 초마다 확인하므로 실시간을 달성 할 수 없습니다. 지연 시간은 5 초 이상입니다.

둘째로, 폴링을 통해 실시간으로 달성 할 수있는 방법이 없습니다.

알림을 거의 실시간으로 전달하는 방법은 메시지를 데이터베이스에 삽입하는 동일한 코드 (예 : 새 레코드에 대해 데이터베이스를 조회해서는 안되지만, 클라이언트에 데이터를 보낼 새 레코드가있을 때. 전송 프로토콜로 긴 폴링을 사용하는 경우에도 마찬가지입니다.

어떻게해야합니까? 불행히도 PHP는 좋은 선택이 아닙니다. 연결을 유지하기 위해 비 차단 서버가 필요합니다. 어떤 연결이 어떤 데이터를 기다리는 지 알 필요가 있으며 PHP (백엔드)에서이 연결을 알리는 방법이 필요합니다.

토네이도 웹 서버 인 node.js 또는 nginx를 사용하여 연결을 처리 할 수 ​​있습니다. 각 연결에 식별자를 할당하고 (아마 이미 사용자 ID가 있음) 새 레코드가 추가되면 PHP 스크립트는 알림 서버 (tornado, node.js, nginx)에 대한 HTTP 요청을 수행하여 어떤 사용자가이 작업을 수행합니다.

는 nginx를 들어, 그래서 당신은 SQL 요청을 게시 한 nginx push stream