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

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

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

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

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

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



답변

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

이러한 기술을 이해하려면 먼저 클래식 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을 확인하십시오 .


답변

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


답변

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

Java 개발자를위한 HTTP

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

서버 측의 비동기 처리

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

서버가 보낸 이벤트

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


답변

실시간 통신을 위해서만 웹 앱에서 Node.JS를 쉽게 사용할 수 있습니다. Node.JS는 WebSocket과 관련하여 매우 강력합니다. 따라서 “Node.js를 통한 PHP 알림”은 훌륭한 개념입니다.

이 예제를보십시오 :
PHP와 Node.js로 실시간 채팅 앱 만들기


답변