2016-09-27 2 views
1

마지막으로 데이터를 보내기 전에 스크립트 실행이 끝날 때까지 SSE 이벤트가 대기하고 그럴듯한 설명이나 해결책을 찾은 후 몇 시간이 지나도 SSE 이벤트가 발생하지 않는 문제가 있습니다.SSE는 스크립트 실행이 완료 될 때까지 이벤트를 보내지 않습니까?

그러나 그 웹 사이트에서 작동하는 코드를 내 서버로 가져 가면 작동하지 않는 예제를 발견했습니다. (URL : http://www.binarytides.com/monitor-progress-long-running-php-scripts-html5-server-sent-events/) 나는 아파치 Header set와의 .htaccess를 통해이 헤더를 보낼 만들려고했을 때 내가 Transfer-Encoding: chunked의 헤더를 발견했습니다이 예에서는

는 응답 코드 "(실패)"으로 향했다.

또한 예제에 Content-Length이없는 것으로 나타났습니다. 내 서버의 경우와 같습니다.

모든 내가 스택에하기로 결정 그 후 크롬 v.53.0.2785.116m

에서 테스트되었다. 여기

은 예입니다

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

    function sendMsg($id, $msg) { 
     echo "id: $id" . PHP_EOL; 
     echo "data: $msg" . PHP_EOL; 
     echo PHP_EOL; 
     ob_flush(); 
     flush(); 
    } 

    while ($x < 5) { 
     $serverTime = time(); 
     sendMsg($serverTime, 'server time: ' . date("h:i:s", time())); 
     sleep(1); 
     $x++; 
    } 
?> 

이 스크립트에 요청을 수행했다 I, 나는이 헤더를 얻을 것입니다 경우

 
HTTP/1.1 200 OK 
Date: Tue, 27 Sep 2016 22:34:11 GMT 
Server: Apache 
Cache-Control: no-cache 
Vary: Accept-Encoding,User-Agent 
Content-Encoding: gzip 
Content-Length: 91 
Keep-Alive: timeout=15, max=43 
Connection: Keep-Alive 
Content-Type: text/event-stream 

내가 때까지이에서 데이터를받지 않습니다를 스크립트 실행이 끝났습니다.

이 시점에서 아파치 나 PHP가 여기에 결함이 있는지는 분명하지 않지만 서버에 무엇이 잘못되었는지는 분명하지 않습니다. 필자는 5.5-7에 이르는 PHP 버전을 사용해 보았습니다. 모두 운이 좋았습니다.

여기에 잘못된 아이디어가 있으며 해결 방법은 무엇입니까?

편집 1 : 나는 다른 서버에서 동일한 스크립트를 시도하고 제대로 일했다, 다음과 같은 헤더를 보내

 
HTTP/1.1 200 OK 
Server: nginx 
Date: Wed, 28 Sep 2016 15:40:00 GMT 
Content-Type: text/event-stream;charset=UTF-8 
Transfer-Encoding: chunked 
Connection: keep-alive 
Keep-Alive: timeout=15 
Cache-Control: no-cache 
ngpass_ngall: 1 
+0

어떻게 동작하는지 보려면 말려들 수 있습니까? 이것은 localhost에서 실행되고 있습니까? 중간에 프록시가있을 가능성이 있습니까? ...하지만 모든 것이 괜찮아 보입니다. flush가 정확하기 전에 ob_flush. 출력이 "gzip"이라는 사실은 내 마음 속에 잔소리가 있지만, 내가 그 대답을 게시하기 전에 몇 가지 확인을해야 할 것입니다. –

+0

@DarrenCook 이제 매우 잃어버린 ... 내가 URL을 웅크 ​​리고, 괜찮 았어,하지만 다시 EventSource를 사용하려고했을 때, 아무것도. 로컬 호스트가 아니며 웹 서버에 있습니다. – user5294195

답변

1

나는 문제가 gzip으로 보내고 출력을 의심합니다. (귀하의 작업의 nginx 서버가 그 일을하지 않습니다.) 당신의 .htaccess 파일에서

, 당신은 두 가지의 시도 할 수 있습니다 :

php_flag zlib.output_compression off 
SetEnv no-gzip 1 

(. https://webmasters.stackexchange.com/q/61258/18151과 그 답변에서 차용)

BTW, 청킹 헤더를 직접 추가 할 필요는 없습니다. 출력이 청크되어 있으면 설정됩니다.

+1

고마워요! 그게 내 문제를 해결 했어! 'php_flag zlib.output_compression off'를 사용할 수 없지만 'SetEnv no-gzip 1'을 사용하여 문제가 해결되었습니다! – user5294195

관련 문제