롱 폴링, 웹 소켓, SSE (Server-Sent Events) 및 혜성이란 무엇입니까?


1046

몇 가지 기사를 읽었지만 개념에 대해서는 아직 명확하지 않습니다.

이 기술이 무엇인지 설명해주는 사람이 있습니까?

  1. 긴 폴링
  2. 서버가 보낸 이벤트
  3. 웹 소켓
  4. 혜성

매번 내가 보았던 한 가지는 서버가 연결을 열어두고 데이터를 클라이언트에 푸시한다는 것입니다. 연결은 어떻게 유지되고 클라이언트는 푸시 된 데이터를 어떻게 얻습니까? (클라이언트가 데이터를 어떻게 사용합니까, 일부 코드가 도움이 될 수 있습니까?)

이제 실시간 앱에 어떤 것을 사용해야합니까? 웹 소켓 (socket.io [node.js 라이브러리] 포함)에 대해 많이 들었지만 PHP는 왜 안됩니까?


1
실시간 웹 소켓 또는 webrtc? PHP에는 websocket 라이브러리가 있으며 ZMQ 또는 소켓 프로그래밍을 사용하여 작동하려면 추가 코드를 작성해야하며 nodeJs는 이것을 위해 쉽게 사용할 수 있도록 만들어졌습니다. PHP에서 websocket을 쉽게 사용할 수없는 이유는 추가 터미널을 실행하고 websocket 서버를 쉽게 사용할 수 있도록 계속 실행해야하기 때문에 두 개의 서버가 있습니다. php라는 구조는 자바 스크립트와 같은 이벤트 구조가 아니기 때문에 websocket은 메시지를 포착하고 보내기 위해 이벤트 구조를 사용합니다.
PauAI

또한 Comet 및 ServerSent Events는 2 대의 서버를 만들지 않고 거의 실시간 (실제 아님)을 달성하는 PHP의 해결 방법입니다.
PauAI

답변:


2075

아래 예에서 클라이언트는 브라우저이고 서버는 웹 사이트를 호스팅하는 웹 서버입니다.

이러한 기술을 이해하려면 먼저 클래식 HTTP 웹 트래픽 을 이해해야 합니다.

일반 HTTP :

  1. 클라이언트는 서버에서 웹 페이지를 요청합니다.
  2. 서버는 응답을 계산합니다
  3. 서버는 클라이언트에게 응답을 보냅니다.

HTTP

아약스 투표 :

  1. 클라이언트는 일반 HTTP를 사용하여 서버에서 웹 페이지를 요청합니다 (위의 HTTP 참조).
  2. 클라이언트는 요청 된 웹 페이지를 수신하고 서버에서 파일을 정기적으로 (예 : 0.5 초) 요청하는 페이지에서 JavaScript를 실행합니다.
  3. 서버는 일반 HTTP 트래픽과 마찬가지로 각 응답을 계산하여 다시 보냅니다.

아약스 폴링

아약스 긴 폴링 :

  1. 클라이언트는 일반 HTTP를 사용하여 서버에서 웹 페이지를 요청합니다 (위의 HTTP 참조).
  2. 클라이언트는 요청 된 웹 페이지를 수신하고 서버에서 파일을 요청하는 페이지에서 JavaScript를 실행합니다.
  3. 서버는 요청 된 정보로 즉시 응답하지 않지만 사용 가능한 정보 가있을 때까지 기다립니다 .
  4. 사용 가능한 새 정보가 있으면 서버는 새 정보로 응답합니다.
  5. 클라이언트는 새로운 정보를 받고 즉시 다른 요청을 서버로 보내 프로세스를 다시 시작합니다.

아약스 긴 폴링

HTML5 서버에서 보낸 이벤트 (SSE) / 이벤트 소스 :

  1. 클라이언트는 일반 HTTP를 사용하여 서버에서 웹 페이지를 요청합니다 (위의 HTTP 참조).
  2. 클라이언트는 요청 된 웹 페이지를 수신하고 서버에 대한 연결을 여는 페이지에서 JavaScript를 실행합니다.
  3. 사용 가능한 새 정보가 있으면 서버는 클라이언트로 이벤트를 보냅니다.

HTML5 SSE

HTML5 웹 소켓 :

  1. 클라이언트는 일반 http를 사용하여 서버에서 웹 페이지를 요청합니다 (위의 HTTP 참조).
  2. 클라이언트는 요청 된 웹 페이지를 수신하고 서버와의 연결을 여는 페이지에서 JavaScript를 실행합니다.
  3. 서버와 클라이언트는 이제 새로운 데이터 (양쪽에 있음)가있을 때 서로 메시지를 보낼 수 있습니다.

    • 서버에서 클라이언트로 실시간 트래픽 클라이언트에서 서버로
    • 이벤트 루프가있는 서버를 사용하려고합니다
    • WebSocket을 사용하면 다른 도메인의 서버와 연결할 수 있습니다.
    • 예를 들어, 타사 호스팅 웹 소켓 서버를 사용하는 것도 가능하다 푸셔 또는 다른 사람 . 이렇게하면 클라이언트 쪽만 구현하면됩니다. 매우 쉽습니다.
    • 더 자세히 읽고 싶다면 ( article ), (article) ( tutorial ) 과 같이 매우 유용합니다 .

HTML5 웹 소켓

혜성:

Comet은 HTML5 이전의 기술 모음으로, 스트리밍 및 롱 폴링을 사용하여 실시간 애플리케이션을 달성합니다. Wikipedia 또는 기사 에서 자세히 알아보십시오 .


이제 실시간 앱에 사용해야하는 코드 중 하나입니다. 웹 소켓 (socket.io [node.js 라이브러리] 포함)에 대해 많이 듣고 있지만 왜 PHP가 아닙니까?

WebSocket과 함께 PHP를 사용할 수 있습니다 . Ratchet을 확인하십시오 .


21
대단해! SSE를 읽고이 기사를 찾았습니다. 지금은 물건을 비교 한 것처럼 SSE를 포함시켜 Websocket과의 차이점을 다시 확인할 수 있습니까?
색인

1
@Tieme 아 그 거였어? SSE가 서버가 보낸 이벤트를 의미한다고 생각했습니다. 어쨌든 고마워요
index

1
Q : PHP에서 websocket을 사용한다고 가정하면 모든 클라이언트가 ws를 사용하여 내 서버에 연결한다고 가정합니다. 하나의 스레드가 그에게 할당되고 정상적인 요청의 경우와 같이 크기가 ~ 2mb입니까? nodejs에서 어떻게 다른가요? Node.js가 처리 할 수있는 동시 클라이언트 수는 몇 개이며 언제 중단됩니까?
Muhammad Umer

5
두 솔루션 모두 동일하게 수행 할 수 있지만 메커니즘은 다릅니다. 롱 폴링은 '일반적인'http 데이터를 사용하고 SSE는 다른 기본 프로토콜을 사용하며 롱 폴링과 다른 서버 설정이 필요합니다.
Tieme

2
원한다면 아파치를 사용할 수 있습니다. 그러나 많은 사람들이 이벤트 루프를 가지고 있기 때문에 Node.js를 사용합니다. 그러나 아파치에 대한 참조 stackoverflow.com/questions/12203443/...
Tieme

37

Tieme은 그의 훌륭한 답변에 많은 노력을 기울 였지만 OPs 질문의 핵심은 이러한 기술이 각 기술의 작동 방식이 아니라 PHP와 어떤 관련이 있는지 생각합니다.

PHP는 명백한 클라이언트 측 HTML, CSS 및 자바 스크립트 외에 웹 개발에서 가장 많이 사용되는 언어입니다. 그러나 실시간 응용 프로그램과 관련하여 PHP에는 두 가지 주요 문제가 있습니다.

1) PHP는 매우 기본적인 CGI로 시작되었습니다. PHP는 초기 단계부터 매우 발전했지만 조금씩 진행되었습니다. PHP는 현재 임베드 가능하고 유연한 C 라이브러리가 된 시점에 이미 수백만 명의 사용자를 보유하고 있었으며, 대부분은 초기 실행 모델에 의존했기 때문에 아직 내부적으로 cgi 모델. 커맨드 라인 인터페이스조차도 PHP 라이브러리 (Linux의 libphp5.so, Windows의 php5ts.dll 등)를 마치 cgi가 여전히 GET / POST 요청을 처리하는 것처럼 호출합니다. "페이지"를 빌드 한 다음 수명주기를 마치는 것처럼 여전히 코드를 실행합니다. 결과적으로 멀티 스레드 또는 이벤트 중심 프로그래밍 (PHP 사용자 공간 내)을 거의 지원하지 않으므로 현재 실시간 다중 사용자 응용 프로그램에는 실용적이지 않습니다.

PHP는 이벤트 공간 (예 : libevent)과 스레드 (예 : pthreads)를 PHP 사용자 공간에 제공하는 확장 기능을 가지고 있지만 매우 소수의 응용 프로그램에서이를 사용합니다.

2) PHP는 여전히 가비지 수집에 중대한 문제가 있습니다. 이러한 문제가 지속적으로 개선되었지만 (위에서 설명한대로 수명주기를 끝내는 것이 가장 큰 단계 일 수 있음) 장기 실행 PHP 응용 프로그램을 만들려는 최선의 시도조차도 정기적으로 다시 시작해야합니다. 또한 실시간 응용 프로그램에는 실용적이지 않습니다.

PHP 7은 이러한 문제를 해결하기위한 훌륭한 단계이며 실시간 응용 프로그램을위한 플랫폼으로 매우 유망한 것 같습니다.


2
하나의 작은 수정 : PHP는 항상 C로 작성되었습니다. museum.php.net/php1 또한 "더 적게 사용하지만 (많은 인기가 있습니다)"는 다소 모순적입니다. 아마 당신이 의미하는 것은 "더 유행"입니까?
IMSoP

@IMSoP-수정 해 주셔서 감사합니다. 저는 10 년 넘게 PHP를 사용해 왔으며 항상 Perl에 뿌리를두고 있다는 인상을 받았습니다. PHP 히스토리 페이지는 원래 C이기도 함을 분명히 지원합니다. 잠시 후 답변을 수정하겠습니다.
JSON

공식 문서와 잘 섞이지 않기 때문에 Perl에 대한 내용을 제거 할 것입니다. 그러나 이것은 여전히 ​​PHP의 초기 개발에서 혼란스러운 부분입니다.
JSON

PHP 7은 실시간 응용 프로그램을위한 플랫폼으로 매우 유망한 것 같습니까? 실시간 애플리케이션을위한 PHP7의 개선 / 변경은 무엇입니까?
I'll-Be-Back


9

나는 이것에 대해 메모하고 자바 관점 에서 예제를 수집하고 썼다 .

Java 개발자를위한 HTTP

리버스 아약스-이전 스타일

서버 측의 비동기 처리

리버스 아약스-새로운 스타일

서버가 보낸 이벤트

같은 주제를 찾고있는 자바 개발자를 위해 여기에 넣습니다.


이 사이트의 대부분은 작동하지 않습니다!
Alexander Dunn

@AlexanderDunn 감사합니다. 업데이트 된 링크로 수정하겠습니다
John

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.