2012-02-12 6 views
2

최근에, 나는 나의 웹 사이트를위한 즉석 통보 시스템을 만들 예정이다. 그런 경우에는 COMET이 필수적이라고 들었습니다.PHP : Longpolling & Comet related

PHP에 대해 이미 검색했습니다 & 한동안 Comet 가이드가 찾은 가이드 &은 반복적 인 아약스 요청처럼 보입니다. 예를 들어 PHP 파일에서 2 초마다 값을 가져 와서 HTML로 출력하는 기본 자바 스크립트 코드가 있습니다. 지금까지 내가 아는 한 COMET이 HTML에 새로운 가치를 부여해야하므로 루프는 클라이언트가 아닌 서버 측에 있어야한다. 제 모국어로 된 기사의 절반이 setInterval()을 사용하고 매 X 초마다 PHP 파일에 접속했습니다.

그래서 저는 몇 가지 질문을드립니다.

  1. 이해하기 쉬운 XAJAX/NOLOH와 같은 외부 프레임 워크를 사용하지 않는 가이드 또는 예제가 있습니까?
  2. 서버 측에서 COMET을 사용하거나 ajax.php에서 X 초마다 값을 요청하는 것의 성능 차이는 무엇입니까?
  3. 위에서 언급 한 시간 초과 요청을 COMET이라고 할 수 있습니까? (예 : Long Polling using jQuery and PHP)
  4. COMET 서버를 실행하려면 확장 프로그램이 필요합니까? (내 웹 호스트가 아파치를 사용하고 있습니다. 개인적으로 Nginx를 사용합니다.)
+1

긴 폴링을 사용하기로 결정했다면 서버 측 노드를 사용하는 것이 좋습니다. 실제로는 아무 것도하지 않는 열린 연결이 많이 있기 때문에 PHP를 사용하면 여전히 필요합니다. 동일한 양의 RAM, 이는 Node가보다 메모리 친화적 인 곳입니다. – zatatatata

답변

3

서버를 폴링해야하기 때문에 클라이언트 측 스크립트 (AJAX)를 사용해야합니다. 서버는 열려있는 연결없이 다른 사람의 브라우저로 메시지를 보낼 수 없습니다.저는 HTML5 웹 소켓에 너무 익숙하지 않지만이 기능을 사용하면 서버와의 지속적인 연결이 가능하지만 HTML5 브라우저는 '공개'웹 사이트의 솔루션으로 널리 사용되지 않습니다.

긴 시간 제한 시간 (예 : 30 초)으로 브라우저에서 비동기 요청을 보내고 요청이 서버에 도착하면 새 메시지를 확인하고 새 메시지를 확인하지만 이제 결과를 직접 출력하는 대신 메시지를 표시하고 무한 루프로 이동하여 데이터베이스를 폴링합니다. 메시지가 발견 될 때까지 매초 (sleep을 사용하여 쿼리를 연기 함). 메시지가 발견되면 루프를 종료하고 결과를 출력합니다. 30 초 후에도 메시지가 없으면 스크립트는 시간 초과되어 빈 요청을 다시 보냅니다.

따라서 요청을 0에서 30 초 사이에 다시 보낼 수 있습니다. 요청이 브라우저에 도착하자 마자 처리되고 새로운 30 초 요청이 전송됩니다.

질문 사항 :

당신은 폴링
  • 당신은 서버 측에 혜성을 사용할 수 없습니다 작업을 수행하는 클라이언트 측 프레임 워크가 필요합니다
    1. . 일반적인 폴링 (예 : 1 초마다 폴링)에 대한 longpolling 사용은 서버 요청이 훨씬 적기 때문에 중요합니다.
    2. 제 이해합니다. 예
    3. 메시지를 쿼리하는 동안 연결을 유지할 수있는 한 모든 서버 측 언어를 사용할 수 있습니다.

    또한 내가 정확히 COMMET이 평균 무엇인지 모르는 http://nodejs.org/

  • 1

    를보십시오. 그러나이 목적을 위해 당신은 많은 해결책을 가지고 있습니다. 아약스에 의한 롱 폴링입니다. 간단합니다. 새 브라우저 만 다시 열 수는 없습니다 (HtML5).

    또 하나의 옵션은 "server-sent -event"입니다. 그것은 HTML5와 브라우저를 요구하는 것하지만 폴링없이 살아 연결을 유지 :

    클라이언트 :

    if (window.EventSource) { 
        window.onload = function() { 
         window.scrollTo(0,1); 
         setTimeout(
         function() { 
    
          var source = new EventSource("events.php"); 
          source.onmessage = function (event) { 
           document.body.innerHTML += event.data + "<br>"; 
          }; 
         }, 1000); 
        }; 
    } else { 
        document.write("Please visit this page in a browser that supports EventSource to see the test"); 
    } 
    

    서버 :

    if ($_SERVER['HTTP_ACCEPT'] === 'text/event-stream') { 
        header('Content-Type: text/event-stream'); 
        echo "data: This is the first event\n\n"; 
        flush(); 
        $i = 5; 
        while (--$i) { 
         sleep(1); 
         $time = date('r'); 
         echo "data: The server time is: {$time}\n\n"; 
         flush(); 
        } 
    } else { 
        echo 'This demo is for use with an EventSource compatible browser.'; 
    } 
    

    goodluck는.