2017-02-19 1 views
2

캠퍼스 프로젝트를 대기 질 모니터링 시스템에서 만들고 있는데, 데이터 (일부 정수 값)는 감지 장치에서 웹 페이지로 가져와야합니다. 내가Php를 사용하여 한 클라이언트에서 다른 클라이언트로 데이터 푸시

이 URL http://localhost/AQProject/recordupdate.php?val=2에 의해 부름 스크립트가 내용을 표시하는 웹 페이지를 업데이트인가요 원하는 것은

. 이제는 데이터를 데이터베이스에 저장하고 매 2 초마다 업데이트를 확인하기 위해 AJAX 기반 쿼리를 실행할 수 있지만 서버에 의해 업데이트가 업데이트되기를 원합니다. 내가 무슨 짓을

은 :

나는 Server sent events을 시도했습니다. 여기에 내가

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

if($_SERVER["REQUEST_METHOD"]=="GET") 
{ 
    if(empty($_GET["val"])) die ("Empty Value from source"); 
    else 
    { 
     $v = $_GET['val']; 
     echo "data: The Pollution stub value is {$v}".PHP_EOL; 
     ob_flush(); 
     flush(); 
    } 
}?> 

을 시도하고 HTML 내가 알아 낸, 이제 스크립트

<script> 
if(typeof(EventSource) !== "undefined") { 
    var source = new EventSource("recordupdate.php"); 
    source.onmessage = function(event) { 
     document.getElementById("result").innerHTML = event.data + 
     "<br>"; 
    }; 
} else { 
    document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events..."; 
} 
</script> 

을 가지고 무엇이 많은 다른 클라이언트 (감지시 때문에 작동하지 않습니다 (만약 내가 잘못 정정 해줘) 있음 유닛)은 recordupdate.php을 웹 페이지 클라이언트가 호출 한 스크립트와 다른 인스턴스로 호출합니다.

server sent events을 사용하여 가능한 방법이 있습니까? 또는 절대적으로 websockets, node.js 등을 파헤쳐 야합니다. 미리 감사드립니다.

답변

1

원하는 작업은 원하는만큼 쉽지는 않지만 여전히 SSE가 적합한 작업입니다. 소켓을 사용할 필요가 없으며 ajax 폴링을 사용할 필요가 없습니다.

하지만 서버에 PHP 스크립트에서 공유 할 수있는 데이터베이스 저장소가 필요합니다. LAMP 스택을 설치하는 것이 쉽기 때문에, MySQL을 사용하는 것이 좋습니다. 비록 당신이 필요로하는 것이 지나치게 많을지라도. 그러나 데이터베이스는 텍스트 파일처럼 간단 할 수 있습니다.

(가능한 한 작게 샘플을 유지하려면 DB가 /tmp/val.txt 일 것으로 가정하고 파일 잠금을 수행하지 않았거나 불량 데이터를 확인하지 않았습니다. . 신뢰할 수없는 환경에서 생산이를 놓기 전에 작품은 내가 파일이 존재하지 않는 대한 소음을 방지하기 위해 /tmp/val.txt을 미리 작성하는 것이 좋습니다 것)

귀하의 recordupdate.php는이 주어진 값을 기록하는 작업이 있습니다.

<?php 
if($_SERVER["REQUEST_METHOD"]=="GET") 
{ 
    if(empty($_GET["val"])) die ("Empty Value from source"); 
    else file_put_contents("/tmp/val.txt", $_GET['val']); 
} 

그런 다음 웹 클라이언트가 연결되는 sse.php가 있습니다.

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 
$prev = ''; 
while(1){ 
    $v = file_get_contents("/tmp/val.txt"); 
    if($v != $prev){ 
    echo "data: The Pollution stub value is {$v}\n\n"; 
    $prev = $v; 
    } 
    usleep(100000); //0.1s 
    } 

이 스크립트는 텍스트 파일의 변경 사항을 초당 10 회 확인합니다. 하나가 발견되면 클라이언트에게 보냅니다. 평균 대기 시간은 0.05 초와 네트워크 오버 헤드입니다. 대기 시간을 줄이려면 적은 시간 동안 수면을 취하십시오.

프런트 엔드 HTML의 유일한 변경 사항은 "sse"를 호출하는 것입니다.대신 PHP는 "

<script> 
if(typeof(EventSource) !== "undefined") { 
    var source = new EventSource("sse.php"); 
    source.onmessage = function(event) { 
     document.getElementById("result").innerHTML = event.data + 
     "<br>"; 
    }; 
} else { 
    document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events..."; 
} 
</script> 
1

HTTP는 편도 프로토콜입니다. 클라이언트에서 서버로만 요청하십시오. 예, 절대적으로 웹 소켓, 노드 .js 등을 파헤쳐 야합니다.

+0

하지만, 데이터가 정말 다른 하나의 클라이언트에서 흐르는 것보고는 이중 연결이 아니라 그것은 전이중 연결을 여는 것보다 간단합니다 –

+0

브라우저 HTTP를 통해에만 보낼 수 있습니다.. 요청을 받고 답을 얻으십시오. 더 자세한 내용은 https://habrahabr.ru/post/209864/을 참조하십시오. 간단한 PHP 서버 및 js 클라이언트 예제가 있습니다. –

관련 문제