2013-04-08 2 views
4

소셜 네트워킹 웹 사이트에서 실시간 알림 업데이트를 구현하려고합니다. 나는 혜성에 대한 연구를 해왔다. 그리고 나는 그것에 매료되었다.혜성과 PHP로 실시간 데이터 업데이트?

내가 이해 한 바로는, 이것은 혜성 서버에서 일어나는 기본적인 흐름입니다.

Webpage: 
Sends an ajax request to server when the document is ready. 

Server: 
Queries the database every x amount of seconds and returns a json string containing results if any are found. 

Webpage: 
Receives the result of the json string from the server and sends out another ajax request to do the above process again. 

혜성이 어떻게 작동하는지에 대한 이해를 통해 필자는 PHP와 Javascript 코드를 작성했습니다.

JavaScript 코드는 jQuery 라이브러리를 사용하며 현재 시간이 유닉스 타임 스탬프 형식의 GET 매개 변수로 서버에 ajax 요청을 보냅니다.

$(document).ready(function(){ 
     var timestamp = Math.round(new Date().getTime()/1000); 

     function comet2(){ 
      $.ajax({ 
       type : 'GET', 
       url : 'comet.activities.php?timestamp=' + timestamp, 
       async : true, 
       cache : false, 

       success : function(data) { 
        alert("current timestamp "+timestamp) 

        var json = JSON.parse(data); 
        if(json !== null){ 
         alert(data); 
        } 

        timestamp = json[0].timestamp; 
        setTimeout('comet2()', 1000); 

       }, 
       error : function(XMLHttpRequest, textstatus, error) { 
        setTimeout('comet2()', 15000); 
       }  
      }); 
     } 

     //call the comet function because the page has loaded. 
     comet2(); 

    }); 

PHP 코드는 타임 스탬프 paramater 사용하여 새 행에 대한 데이터베이스를 검색하여 새로운 활동에 대한 쿼리합니다 (이 경우, 쿼리에서 유닉스 타임 스탬프). 이 예를 들어, 나는 1

<?php 
    set_time_limit(0); 
    include("models/config.php"); 
    global $mysqli,$db_table_prefix; 

    $last = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 
    $results = null; 
    $flag=true; 

    $stmt = $mysqli->prepare("SELECT id,timestamp FROM uc_user_activity WHERE timestamp > ? ORDER BY timestamp DESC LIMIT 0,1"); 
    $stmt->bind_param("i", $last); 
    $stmt->bind_result($id,$timestamp); 

    while($flag){ 
     $stmt -> execute();  

     while ($row = $stmt->fetch()){ 
      $flag = false; 
      $results[] = array(
       "id" => $id,  
       "timestamp" => $timestamp 
      ); 
     } 

     $stmt -> close(); 

     usleep(100000); 
     clearstatcache(); 
    } 

    echo json_encode($results);  

?> 

에 결과의 양을 제한 코드를 위하지 않습니다 실제로 '작업'문제는 사용자 게시물 경우 새 댓글, 그것은 추가에 실패하는 것입니다 혜성 스크립트가 실행 중일 때 데이터베이스. 즉, SQL 쿼리의 명령문이 결코 충족되지 않기 때문에 혜성 스크립트는 절대로 json 결과를 반환하지 않습니다 (새 활동에 새로운 타임 스탬프가 추가되지 않음). 새 코멘트를 게시하는 내 아약스 코드는 100 % 작동하므로 문제가 아님을 알고 있습니다. 단순히 '아무 일도 일어나지 않습니다.'즉, 아무 것도 (오류 없음) 경고되거나 브라우저 콘솔에 출력됩니다.

편집 수 3 : 나는 심각 그래서 데이터베이스 삽입 혜성 스크립트 JQuery와에서 호출 될 때 실패 보여주는 이미지를 업로드, '아무 일이 없다'가 무슨 뜻인지 설명하기 위해 사투를 벌인거야 (어떻게 알 코멘트가 아약스를 통해 게시되는 동안 텍스트 박스는 비활성화됩니다).

enter image description here

나는 이것에 대해 무엇을 할 수 있습니까? 나는 이것을 고치려고 노력하는 인터넷을 검색하는 데 많은 시간을 보냈지만 아무런 효과가없는 비슷한 작업 예제를 찾는다.

나는로 내 PHP 코드에서 쿼리를 변경하는 경우 :

$stmt = $mysqli->prepare("SELECT id,timestamp FROM uc_user_activity WHERE timestamp **<** ? ORDER BY timestamp DESC LIMIT 0,1"); 

대신 :

결과는 즉시 브라우저 창을 경고하는 는 의견이 다시 게시 할 수

$stmt = $mysqli->prepare("SELECT id,timestamp FROM uc_user_activity WHERE timestamp > ? ORDER BY timestamp DESC LIMIT 0,1"); 
하고 스크립트 다시 호출되고 새 게시물이 표시됩니다. 이것은 ... 내 코드가 잘 Afterall는이 '노력'과 쿼리가 문제를 일으키는 것처럼 보이는 것을 알 수

enter image description here

사람이 여기에 무슨 일이 일어나고 있는지 볼 수 있을까요? 나는이 질문을 지금 7 번 편집했으며, 아무 것도 얻지 못하면 어떤 지침도 훌륭 할 것입니다.

이 혜성 서버를 구현하는 더 좋은 방법이 있습니다

그냥 그래서 이것은 내 질문에 내가 위에서 언급 한 내용을 모아 여기에, 폐쇄하지 않습니다? 나는 가장 숙련 된 녀석 이 아니지만, 실제로 어떻게해야하는지 배우고 싶습니다. .그것은 StackOverflow이 기능을 가지고있는 것 같습니다 그리고 그것은 완벽하게 작동 - 그들은 그것을 어떻게하고 있습니까?

나는 이보다 더 자세하게 내 게시물을 쓸 수 없으며, 훌륭한 조언을 주시면 감사하겠습니다. 왜 내 코드가 작동하지 않는지에 대한 제안이나이를 구현하는 방법을 설명하는 튜토리얼에 대한 링크는 놀라운 것입니다! 이 괴물과 모든 수정 사항에 대해 미리 감사드립니다.

+1

"이 스크립트는 이미 새 게시물에 대해 데이터베이스를 쿼리하고 있기 때문에 데이터베이스에 추가하지 못합니다"--- --- 따라서 한 스크립트는 선택을 수행하고 다른 스크립트는 삽입을 수행합니다. 실패의 원인은 무엇입니까? – zerkms

+1

설명해 드릴 것입니다. 댓글을 너무 빨리하는 +1! –

+3

"제대로하고 있습니까?" --- PHP로 작성된 혜성 서버는 이미 나쁜 결정입니다. – zerkms

답변

0

내 직감은 전달하는 타임 스탬프 값이 결과를 반환하지 않는다는 것입니다. Javascript를 통해 현재 시간을 알 수 있습니다. 쿼리는이 타임 스탬프 이후 모든 게시물을 쿼리합니다.

쿼리를 인쇄하고 동일한 쿼리를 수동으로 실행하여 데이터베이스에서 데이터를 검색 할 수 있습니까?

0

그래서 Comet with PHP에 대한 유용한 튜토리얼은 여기에 있습니다. 그와 마찬가지로 http://www.zeitoun.net/articles/comet_and_php/start

, 도움이된다면 : jQuery로 링크에 위의 간단한 채팅 솔루션을 사용하고자하는 사람들을 위해

여기에 솔루션입니다.

<script type="text/javascript"> 
    var Comet = {}; 
    Comet.jquery = { 
     timestamp: 0, 
     url: './backend.php', 
     noerror: true, 
     initialize: function() { 
     }, 
     connect: function() 
     { 
      this.ajax = $.ajax({ 
       type: "get", 
       url: this.url, 
       data: {timestamp: this.timestamp}, 
       success: function (data) { 
        // handle the server response 
        var response = JSON.parse(data); 
        console.log(response); 
        //alert(response.timestamp); 
        Comet.jquery.timestamp = response.timestamp; 
        Comet.jquery.handleResponse(response); 
        Comet.jquery.noerror = true; 
       }, 
       complete: function (data) { 
        // send a new ajax request when this request is finished 
        if (!Comet.jquery.noerror) { 
         // if a connection problem occurs, try to reconnect each 5 seconds 
         setTimeout(function() { 
          Comet.jquery.connect() 
         }, 5000); 
        } 
        else { 
         Comet.jquery.connect(); 
        } 
        Comet.jquery.noerror = false; 
       } 
      }); 
     }, 
     disconnect: function() 
     { 
     }, 
     handleResponse: function (response) 
     { 
      $('#content').append('<div>' + response.msg + '</div>'); 
     }, 
     doRequest: function (request) 
     { 
      $.ajax({ 
       type: "get", 
       url: this.url, 
       data: {'msg': request} 
      }); 
     } 
    } 
</script>