2012-06-28 4 views
1

에서 작업 플러시()를 가져올 수 없습니다 Windows 환경) 나는 그것을 작동시킬 수 없다, 그것은 3 초 후에 모든 출력.

테스트 서버로 내 로컬 상자에 동일한 PHP 버전 (5.3.13)과 Apache (2.2.22) 버전을 사용하고 있습니다. 나는 가 여기에 내가 mod_gzip 설치하지 않은

output_buffering 0 
zlib.output_compression = Off 
zlib.output_compression_level = -1 

(테스트 서버에 동일) 내가 설정 한 설정입니다 httpd.conf 파일뿐만 아니라 모두의 php.ini의 설정의 대부분을 반영했다 .

나는 내 상자에 Wamp 설치를 시도해 보았고, 그 중 하나에서 작동하지도 않았다.

나는 그것이 클라이언트 상상할 수없는 (브라우저 - 파이어 폭스 13) 문제 나 테스트 서버에서 스크립트를 볼 수있는 동일한 브라우저를 사용하고 내가 시도

는 암시 플러시 수 있도록 잘 작동으로 , ob_flush하기 등등. 행운을 빈다.

누구나이 아이디어를 얻는 방법에 대한 아이디어가 있습니까?

+1

웹 서버가 버퍼링 할 수 있습니다. 브라우저는 버퍼링 할 수 있습니다 (MSIE는 출력량이 일정 할 때까지 유명하지 않습니다), 서버 홉은 버퍼링 할 수 있습니다. HTTP/HTML 페이지는 ' 달리기 콘솔 '을 좋아하지만 많은 사람들이 좋아할 것입니다. – Wrikken

+0

얼마 전 나는 같은 문제에 부딪혔다. 나는 전체 논리를 재검토했다. 나는 PHP에서'text/plain' 타입으로 "동적 인"데이터를 얻고 Javascript로 멋진 HTMLy를 처리하는 결과를 가져 왔습니다. 다시 말해, 이것을 코드'header ('Content-type : text/plain')의 시작 부분에 넣으십시오. – Adi

+0

내 상사가 나에게 말하기 위해 들어 와서 미안합니다. 그 헤더를 설정하지 않았다면 – Kris

답변

2

@Wrikken이 말한 것을 명심하십시오. 이것은 권장하지 않습니다.

나는 생각하고 있었고, 당신이하는 모든 일이 옳은 것처럼 보였습니다. 귀하의 설정을 복사하고 시도했습니다. 나는 똑같은 문제에 직면했다. 커맨드 라인에서 스크립트를 실행했습니다.

그런 다음 마지막 테스트 Wireshark를 수행해야했습니다. 패킷의 첫 번째 몇 가지 다음에 그것은 서버가 모든 것을 올바르게 전송하고 있다는 것이 분명해 졌기 때문에 브라우저의 버퍼 여야했습니다.

그래서 루프 이전에 데이터를 보내려고했는데 어떻게 됐을까? 그것은 효과가있다! 내가보기 엔 당신이 다른 옵션을 조사하는 것이 좋습니다

<?php 
ini_set('output_buffering','off'); 
ini_set('zlib.output_compression', 0); 
echo str_repeat(" ", 1024), "\n"; 
for($i=0;$i<6;$i++) { 
     echo $i."<br />\n"; 
     ob_flush(); 
     flush(); 
     sleep(1); 
} 
?> 

난 당신이 생각하고있는 응용 프로그램에 대한 확실하지 않다, 그러나 이것은 분명히 좋은 생각이 아니다 : 여기

는 당신은 간다.

업데이트 : 긴 Google 검색 후 나는 대부분의 브라우저가 특정 수를 버퍼 페이지의 문자를 구성하는 방법 모른 채 this

브라우저가 올바르게 페이지를 렌더링 할 수 없기 때문에 this 발견 자바 스크립트를 실행하거나 페이지를 그리기 전 바이트 수

,451,515,

는 항상 HTML 문서보다 큰 1킬로바이트 (1024 바이트에 의해 사용되는 최대 버퍼 한계 인, 정확하게하기 위해, 가능한 한 빨리 문자 인코딩을 지정해야합니다, 이러한 지연을 방지하기 위해 테스트 한 브라우저 중 하나).

<?php 
ini_set('output_buffering','off'); 
ini_set('zlib.output_compression', 0); 
//echo str_repeat(" ", 1024), "\n"; 
header('Content-Type: text/html; charset=iso-8859-1'); 
//Note that it shoudn't matter which charset you send 
for($i=0;$i<6;$i++) { 
     echo $i."<br />\n"; 
     ob_flush(); 
     flush(); 
     sleep(1); 
} 
?> 

그래서 왜 첫 번째 서버가 아닌 두 번째로 작업 한 (그리고 일) :

그래서 나는 버퍼를 채우는 첫번째 대신 캐릭터 세트를 보내려고?

대부분의 경우 첫 번째 서버가 헤더가있는 문자 세트를 보내고 두 번째 서버는 그렇지 않은 것 같습니다. 귀하의 경우에는

그러나, 나는 다음은 내 문제에 대한 해결책을 발견

<?php 
ini_set('output_buffering','off'); 
ini_set('zlib.output_compression', 0); 
//Plain text MIME type since you'll use for logging purposes 
//and if you run it from CLI, you can ignore the whole header line 
header('Content-Type: text/plain; charset=iso-8859-1'); 
for($i=0;$i<6;$i++) { 
     //No need to echo <br /> once you'll run it from CLI 
     echo $i."\n"; 
     ob_flush(); 
     flush(); 
     sleep(1); 
} 
?> 
+0

고마워! 내가 필요한 이유는 CLI에서 일주일에 한 번씩 cron으로 실행되도록 30 분 이상 걸리는 무거운 스크립트를 처리하고 있기 때문입니다. 개발하는 동안 나는 플러시를하고, 실행이 끝날 때까지 기다릴 필요없이 모든 것이 제대로 실행되도록 할 수 있습니다. 제대로 작동하면 일단 플러시를 로깅으로 바꿀 것입니다. – Kris

+0

내가 가지지 못하는 한가지는 우분투 서버에서 스크립트를 실행할 때 브라우저의 버퍼가 어떻게 작동하는지 알 수 있지만 내 로컬 서버에서는 실행되지 않습니다 (두 경우 모두 내 컴퓨터에서 브라우저를 사용하고 있습니다.) – Kris

+1

@Kris, 나는 더 많은 설명을하기 위해 나의 대답을 업데이트했다 – Adi

1

변화 할 것입니다. 내 php.ini 파일에

default_charset = "utf-8" 

가 작동하게 줄을 추가 어떤 이유로 . 라인 제거를 확인했습니다. 플러시가 작동하지 않았습니다. 추가하여 작동했습니다. 아마도 브라우저 버퍼를 충분히 제공하는 추가 헤더를 추가하기 때문일 수 있습니다.

+0

좋은 캐치 !!!!! – Adi

관련 문제