서버 이벤트 시 서버에서 클라이언트로 알림 전송
어떻게 하면 외부 Ajax 호출을 피하면서 PHP로 서버에서 클라이언트로 메시지를 보낼 수 있습니까?
아이디어는 다음과 같습니다.
사용자: Alice가 변경하여 서버로 전송합니다.
그런 다음 서버는 어떤 사용자가 최신 상태가 아닌지 확인하고, 그렇지 않을 경우 일부 코드를 호출하여 변경사항과 관련된 정보를 Bob(이 경우 최신 상태가 아닌 Bob)에게 보냅니다.
어떻게 밥에게 메시지를 보내죠?
이것들은 종종 간과되는 웹소켓의 사촌으로 무게가 더 가볍고 한 가지 방법입니다.기본적으로 클라이언트는 서버의 메시지를 기다릴 수 있습니다(AJAX와 같은 다른 채널을 통해 응답할 수 있음).
클라이언트 코드 예제:
var source = new EventSource('/newFile');
source.addEventListener('message', function(e) {
// Use AJAX and pull new file here
}, false);
안타깝게도 IE 지원이 없는 것으로 보입니다.EventSource HQ와 같은 라이브러리를 사용하여 브라우저 간 서버 전송 이벤트를 지원할 수 있습니다.악마의 브라우저를 다룰 필요가 없어집니다.
당신이 찾고 있는 것은 (현재) 상당히 일반적인 것이며, 때로는 "실시간 웹"이라고도 합니다.서버 측 코드가 연결된 클라이언트에 실시간으로 콘텐츠를 푸시할 수 있는 기능입니다.
이는 최신 브라우저(및 서버)에서 지원되는 몇 가지 새로운 메커니즘과 실제로는 그렇게 하도록 설계되지 않았지만 작동하기 위해 "해킹"으로 사용될 수 있는 다른 메커니즘을 통해 가능합니다.
먼저 이해해야 할 것은 (서버가 클라이언트에게 메시지를 "푸시"하는" 요청은) 웹(또는 적어도 http)의 작동 방식(또는 더 나은 방식)이 아니라는 것입니다.기존 웹은 상태 비저장, 요청-응답, 반이중입니다. 클라이언트는 통신을 시작하고 서버에 대한 연결을 열고 서버는 서비스를 제공하며 연결은 닫힙니다.또한 서버가 웹 클라이언트에 메시지를 보내는 방법은 없었습니다. 클라이언트(즉, 브라우저)는 리버스 모델(수신하는 엔드포인트 제공)을 지원하여 효과적으로 서버가 되어야 합니다.
이것은 WebSockets와 같은 새로운 표준이 제공하는 것입니다(또 다른 표준은 SSE(Server-Sent Events). 그러나 지원은 WebSockets보다 훨씬 부족하며 단일 메시지를 보내는 것보다 콘텐츠를 "스트리밍"하는 경향이 있는 것으로 보입니다.).
HTTP와 달리 WebSocket은 사용자가 찾고 있는 전이중 통신을 제공합니다(어느 쪽이든 시작할 수 있음).올바른 버전의 WebSocket 프로토콜(일부 브라우저에는 이전 버전의 버그 구현이 있음)은 Firefox 6, Safari 6, Google Chrome 14, Opera 12.10 및 Internet Explorer 10에서 구현됩니다.
그렇다면, 브라우저가 웹소켓을 지원하지 않는다면 어떻게 될까요?당신은 제가 앞에서 말한 "꼼수"를 사용해야 합니다.이러한 "꼼수"는 푸시 기술의 범위에 속합니다.
특히, 일반적인 기술은 긴 폴링입니다.이름에서 알 수 있듯이, "푸시"가 아닙니다. 긴 폴링은 폴링, 즉 "풀" 기술이지만 푸시 메커니즘을 에뮬레이트할 수 있습니다.긴 폴링을 사용할 경우 클라이언트는 HTTP/S 요청(폴링)을 훨씬 느린 빈도로 실행하는 것을 제외하고 일반 AJAX 호출에서와 동일하게 서버에서 정보를 요청합니다.
연결 시 서버(서버, API: 서블릿, HTTP 핸들러, REST 컨트롤러 등).일반적으로 표준 AJAX 호출에 대한 지원을 제공하는 것과 동일한 메커니즘을 사용하여) 이미 사용 가능한 업데이트가 있는 경우 일부 정보를 전송합니다. 새 업데이트가 없으면 빈 응답을 보내는 대신 요청을 열린 상태로 유지하고 응답 정보를 사용할 수 있을 때까지 기다립니다.
사용자는 "기존" 클라이언트 시작 요청을 가지고 있지만, 서버가 사용자와 통신할 내용이 있을 때까지 "보류" 상태가 됩니다.서버는 HTTP 채널을 통해 응답(여전히 열려 있음!)을 클라이언트로 전송하여 열린 HTTP 요청을 완료합니다.
플러그인에서 제공하는 소켓 사용(Silverlight, Java 애플릿, Flash 등)과 같은 다른 기술도 사용할 수 있지만, 이를 이용하려면 올바른 클라이언트(브라우저/플러그인 콤보)가 필요합니다.
물론, 이 모든 것을 혼자서 구현할 수 있습니다.그리고 저는 여러분이 학습 연습으로 노력하기를 권장합니다.
프로덕션 코드의 경우 SignalR(ASP용)과 같이 이러한 모든 개념과 기법을 캡슐화한 라이브러리를 사용하는 것이 좋습니다.NET) 라쳇(PHP용), 신호.IO(node.js용), Faye(Ruby용)...이러한 라이브러리 중 일부는 둘 이상의 기술을 구현하고 클라이언트를 기반으로 최상의 기술을 선택하여 자동으로 다른 라이브러리로 이동합니다.그들은 정말로 여러분의 수고를 덜어줍니다!
코멘트에서 언급했듯이, 당신이 찾고 있는 기술은 웹소켓입니다.서버와 웹 검색 클라이언트 사이에 소켓(필수 입찰 교정 파이프를 가리키는 유닉스 용어)을 둘 수 있는 방법입니다.
원시 웹 소켓 API로 작업할 수 있습니다.저는 소켓과 같은 도서관을 이용하는 것을 선호합니다.나를 위해 추잡한 세부 사항들을 추상화하기 위한 IO.
패키지를 일반적으로 설치한 후에는 (노드를 사용한다고 가정할 때) 소켓을 사용합니다.IO는 이벤트 및 브로드캐스트와 같은 다양하고 간편한 방법을 애플리케이션에 통합할 수 있습니다.웹 소켓을 브라우저 간 웹 소켓으로만 사용할 수도 있습니다(웹 소켓을 지원하지 않는 브라우저에 대한 폴링을 구현합니다).
서버에서 파일이 변경될 때마다 서버에서 클라이언트로 메시지를 발송할 수 있습니다.
서버 측 하나(Node.js):
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.on('message', function () { });
socket.on('disconnect', function () { });
// more stuff here
if(somethingChanged) {
socket.send(JSON.stringify({changed: true, file: 'file1.txt', newContent: 'Im fresh off the press yo!'});
}
});
클라이언트의 경우:
<script>
var socket = io('http://localhost/');
socket.on('connect', function () {
socket.send('anything-new');
socket.on('message', function (msg) {
if(JSON.parse(msg).changed) {
// Do stuff here
}
});
});
</script>
이것은 아주 간단한 예이지만 시작하기에 충분할 것입니다.
언급URL : https://stackoverflow.com/questions/24354902/send-notification-from-server-to-client-on-server-event
'programing' 카테고리의 다른 글
최대 높이의 자식: 100%가 상위 항목으로 넘칩니다. (0) | 2023.08.22 |
---|---|
공유 기본 설정에 어레이 목록 저장 (0) | 2023.08.17 |
okhttp3 mockserver java.dll.NoClassDefFoundError: okhttp3/내부/동시/TaskRunner$RealBackend (0) | 2023.08.17 |
PHP Symfony 4에서 POST 글로벌 변수를 가져오는 방법은 무엇입니까? (0) | 2023.08.17 |
UIStatusBarStyle이 Swift에서 작동하지 않음 (0) | 2023.08.17 |