2013-04-20 3 views
7

웹 서버에서 데이터를 다시로드 할 때 '가장 좋은 방법'(예 : 가장 효율적이고 가장 많이 사용되는 일반적인 방식)을 찾고 있습니다. 프런트 엔드.효율적으로 데이터를 다시로드하고 서버에서 클라이언트로 데이터를 푸시

enter image description here

데이터 스트림은 최종 애플리케이션에 서로 다른 될 것이다 : 최종 어플리케이션에서, I 데이터가 다음과 같이, 예를 들면, 기록해야하는 여러 출력 필드를 가질 것이다. 서버의 최신 데이터로 라인을 다시로드해야합니다.

매초마다 업데이트 할 Ajax 요청을 사용하려고 생각했지만 다른 방법이 있어야합니다. Ajax 요청은 많은 데이터 트래픽을 유발할 것이다. 또한 페이스 북 채팅을 사용할 때 매 초마다 기다릴 필요없이 채팅이 거의 즉시 수신됩니다. 그러나 모질라 파이어 폭스의 개발자 도구를 사용할 때 Ajax 폴링 요청이 표시되지 않습니다. 이것은 다른 방법이있을 것이라고 생각하게했습니다.

Node.js를 살펴 봤지만 내 호스트에서는 불가능합니다.

사람들이 Ajax Push에 대해 이야기하는 것을 들었습니다. 그게 내가 사용해야하는 것입니까? 그렇다면 기본 사용 예제를 제공 할 수 있습니까?

그렇지 않다면 초 단위로 다시로드해야하는 데이터 스트림이있을 때 ,은 어떻게 될까요?

요구 사항은 입니다. 속도는이고 데이터 트래픽은입니다. 따라서 서버를 지속적으로 폴링하는 것은 옵션이 될 수 없다고 생각합니다. 이는 엄청난 오버 헤드가 발생하기 때문입니다.

나는 그다지 중요하지 않다고 생각하지만 백엔드에서는 PHP5.3을, 프론트 엔드에서는 jQuery 1.9.1에서 JavaScript를 사용하고 있습니다.

답변

8
이 질문은 여러 번 요청되었습니다

하지만 약간 다른 방식으로 응답을 보낼 :
없음 데이터 없음을 나타내는 응답을 보냅니다. 요약에서

가 : 당신이보고있는 경우 여기에 읽기 가치가있는 몇 가지 언급은 요 건물 아파르 어에서 PHP를 사용하는 ur 솔루션은 오픈 영속 연결 (HTTP 긴 폴링 또는 스트리밍)을 사용하면 리소스를 매우 빨리 (매우 비효율적으로) 사용할 것입니다. 따라서 hosted solution (* 면책 조항 - 나는 호스팅 솔루션을 위해 일합니다)을 사용하는 것이 더 낫습니다.

HTTP-Long 폴링 및 HTTP 스트리밍은 Server-Sent Events 및 WebSockets로 대체 된 솔루션입니다. 따라서 가능한 경우 (웹 클라이언트가 지원을 제공하는 경우) HTTP 기반 솔루션으로 전환하기 전에 이러한 솔루션 중 하나를 사용해야합니다. 좋은 실시간 웹 기술로 자동으로 처리됩니다.

다이어그램에 여러 데이터 스트림을 구독하고있는 것으로 표시되므로 자연히이 솔루션과 맞는 Publish/Subscribe 솔루션을 고려해야합니다. 다시 말하지만, 좋은 실시간 웹 테크 솔루션이 이것을 제공 할 것입니다.

realtime web technology guide도 참조하십시오.

+1

+1 최근에 공개 한 프로젝트에서이 정보를 추적하는 데 시간이 걸렸습니다. 나는 웹 개발 경험이 전혀 없었으며 웹 서버에서 브라우저로 데이터를 전송하는 것이 드문 일임을 알고 놀랐습니다. –

2

나는 당신이 찾고있는 것이 일반적으로 Comet이라고 생각합니다. 이 기법은 다음과 같이 종종 만들어졌습니다 :

  • 클라이언트 (웹 브라우저)는 서버에 새 데이터를 요청합니다. 이것은 페이지를 다시로드하는 것이 아니라 JavaScript로 수행됩니다.
  • 서버는 클라이언트에 대한 데이터가있을 때 요청에 응답합니다. 다시 말하면, 이것은 재로드되는 페이지 자체가 아니기 때문에 UI에 영향을 미치지 않습니다. 데이터의 loaindg는 JavaScript 코드에서 "백그라운드에서"수행됩니다.
  • 서버 쪽에서 요청은 새 데이터를 기다리고 사용 가능한 경우 새 데이터를 반환하거나 서버에 정의 된 시간 제한 간격에 도달하면 아무 것도 반환하지 않습니다. 이 시간 초과는 일반적으로 브라우저 HTTP 시간 초과보다 낮게 설정됩니다. 그 이유는 서버가 특정 클라이언트가 특정 데이터를 가지고 있는지 여부를 알 수 있기 때문입니다. 요청이 클라이언트 측에서 시간 초과되도록 허용 된 경우 클라이언트 요청 시간이 초과 된 후 원래 요청이 서버에 응답 될 수 있으며 클라이언트가 데이터를 가져 오지 않을 수도 있습니다 (서버가 생각한 경우에도).

실제로 데이터는 일반적으로 JSON으로 전송되지만 사용자가 원하는 인코딩을 선택할 수 있습니다. 이를 수행하는 방법의 한 예는 here을 참조하십시오. Goosh은이 기술의 또 다른 예이며 Interactive Python Shell도 마찬가지입니다. all에 대한 코드를 사용할 수 있습니다.


PHP 측에서는 이러한 "배경"JavaScript Comet 요청에 응답 할 페이지를 만들고 싶습니다. 사용자가로드하는 페이지와 동일한 페이지 일 수도 있지만, 설명의 편의를 위해 다른 페이지라고 가정 해 보겠습니다. 따라서 사용자는 index.php을로드하고 JavaScript Comet 코드는 getNewData.php을 호출하여 새 데이터를 검색합니다.

getNewData.php에서 이벤트를 기다리고 데이터를 반환하는 것이 좋습니다. 이것을 위해 폴링을 사용하고 싶지는 않지만 다양한 프로세스 간 통신 전략을 사용하여 이벤트를 기다리는 PHP 라이브러리가 있습니다 (this question for instance 참조). 로 보일 것이다 당신의 getNewData.php에 대한 높은 수준의 의사 코드는 다음과 같습니다

  1. 구문 분석 JSON 요청
  2. (타임 아웃) 효율적인 대기 상태를 입력, 당신을 기다리고 "새로운 데이터 것은 가능하다"
  3. 습니까 이전 이벤트 단계 타임 아웃?
    예 : 새로운 데이터
+0

이 답변은 기술적으로 정확하지만 구식이고 비효율적 인 해결책을 제안하고 있으며 최신 기술로 더 잘 해결됩니다. Comet은 요청 된 기능을 수행하기위한 HTTP 해킹의 포괄적 인 용어입니다. HTML5는 [Server-Sent Events] (http://en.wikipedia.org/wiki/Server-sent_events)와 [WebSockets] (http://en.wikipedia.org/wiki/WebSocket)을 도입하여 이러한 해킹이 없도록했습니다. 이러한 유형의 문제를 해결하기위한 호출의 첫 번째 포트가 길어집니다. 또한 PHP 서버에서의 긴 폴링 접근법 (이 답변에서 설명한대로)은 매우 비효율적입니다. – leggetter

관련 문제