2014-12-13 2 views
1

실시간 서버 로그 뷰어를 작성하고 SSE에 대해 학습했습니다. 나는 그것을 올바르게 사용하는 방법에 관해서 혼란 스럽다. 저는 PHP 5.4로 리눅스 서버를 운영하고 있습니다.SSE가 연결을 유지할 수 없습니다.

HTML + JS :

<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
    <ul id='el'></ul> 
    <script type="text/javascript"> 
     var eSource = new EventSource("ssedemo.php"); 
     eSource.onmessage = function(event) { 
      var e = document.createElement("li"); 
      e.innerHTML = event.data; 
      document.getElementById('el').appendChild(e); 
     }; 
    </script> 
</body> 
</html> 

PHP :

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 
$time = date('r'); 
echo "data: The server time is: {$time}\n\n"; 
ob_flush(); 
flush(); 
?> 

이 작동하지만, 각 업데이트와 클라이언트 후 연결을 떨어 그것은 모든을 재 확립 지금은이 코드를 3 초. 빨리 업데이트하고 싶습니다.

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 
while(true) { 
    $time = date('r'); 
    echo "data: The server time is: {$time}\n\n"; 
    ob_flush(); 
    flush(); 
    sleep(1); 
}; 
?> 

문제가 있다는 것입니다 : 문서 및 온라인 자습서에서, SSE를 사용하기에 적합한 방법은 연결을 유지하기 위해 루프에서 서버 코드를 포장하고 업데이트 시간을 제어 할 수 sleep를 사용하는 것 같습니다 이 작동하지 않습니다. 루프를 도입 할 때마다 onmessage은 클라이언트 측에서 절대 호출되지 않습니다. 어떤 코드(), (https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events) 등을 변경하지 않고 수많은 예제를 시도했지만, PHP에서 루프를 제거하지 않으면 이들 중 아무 것도 작동하지 않습니다.

연결을 유지할 수없는 이유는 무엇입니까? 이 작업을 막는 PHP 5.4의 변경 사항이 있습니까?

+0

어떤 브라우저를 사용하고 있습니까? 그리고 이것은 로컬 호스트 서버입니까, 아니면 원격 서버입니까? –

+0

원격 서버. 나는 크롬, 파이어 폭스, IE와 같은 모든 경우에 똑같은 동작을 시도했다. – Cbas

+1

사소한 문제는 IE를 사용한 첫 번째 예제 (no-while-loop)로 전혀 출력이 없다고 가정한다 (SSE를 지원하지 않으므로)? –

답변

1

마지막 질문에 먼저 대답하기 위해 PHP 5.4에서이 작업을 중단하는 변경 사항이 없었습니다.

모든 것이 올바르게 보입니다. 대신 onmessage의 난 항상 이런 식으로 사용하고 있습니다 :

eSource.addEventHandler('message', function(event) { 
    var e = document.createElement("li"); 
    e.innerHTML = event.data; 
    document.getElementById('el').appendChild(e); 
}, false); 

하지만 어느 쪽이든 잘 생각합니다. (거기에는 while 루프 없으며, 하나의 데이터 패킷이 전송 될 때 작동하는 말을 당신에 의해 확인.)

그래서, 내가 할 수있는 모든 문제 해결의 아이디어 몇 가지 제안입니다 : 당신이 방화범을 사용할 수

을, 또는 크롬 개발자 콘솔에서 연결이 무엇을하고 있는지 확인할 수 있습니까?

즉시 닫히는 지 (구문 오류 또는 PHP 스크립트의 다른 충돌을 의미 함) 또는 영원히 열리지 만 데이터를받지 못하는 것 (서버 측 캐싱, 또는 중간 프록시 서버 캐싱) 또는 영원히 열어두고 데이터 수신 (자바 스크립트에 문제가 있음을 나타냄)

또한 JS 콘솔에서 경고를 확인하고 서버 측 PHP 오류 로그에서 경고를 확인하십시오.

+0

크롬 콘솔에서 JS 경고/오류가없고 데이터를받지 않고 연결이 열린 채로 있습니다 - '보류 중'이라는 메시지가 표시되고 약 2 분 후에 취소됩니다. .내 서버에서 디버그 로그를 활성화하고 새 로그 파일을 만들었지 만 데모 페이지를 몇 번 새로 고친 후에 오류가 나타나지 않았습니다. – Cbas

+0

@Cbas Interesting; 확실히 서버 측 문제 (또는 중간 방화벽 또는로드 밸런서)와 같은 것 같습니다. 그것은 귀하의 질문에 추가 할 가치가있을 수 있습니다 : 어떤 리눅스 배포판, 그리고 공유 또는 전용 서버, 그리고 당신이 네트워크 토폴로지에 대해 아는 것. 신선한 EC2 (또는 이와 유사한) 인스턴스로 문제를 재현 할 수 있다면 흥미롭고 놀랄 것입니다. –

+0

나도 그렇게 생각한다. 나는 공유 호스팅 계정을 사용하고 있으며 서비스 제공 업체에 전화를 걸었을 때 OS는 오래된 IT 부서에서 지원하지 않는 맞춤형 Linux 배포판이라고했는데 아마도 문제의 근원이 될 것입니다. 더 새로운 리눅스 배포판의 다른 공유 호스팅 계정에 연결하고 그 결과를 게시하십시오. – Cbas