2011-08-29 4 views
1

비슷한 주제에 대해 살펴 보았지만 현재 어떤 문제도 해결하지 못했습니다. 나는 이것을 가지고있다 :AJAX에서 PHP 스크립트 루프를 요청합니다.

<script type="text/javascript"> 

       http = new XMLHttpRequest(); 

       function fetch() 
       { 

        http.open("GET", "script.php", true); 
        http.onreadystatechange = useHttpResponse; 
        http.send(null); 

       } 

       function useHttpResponse() 
       { 

        if(http.readyState == 4) 
        { 

          var textout = http.responseText; 
          document.getElementById("ajax").innerHTML=textout; 

        } 

       } 

</script> 

매우 기본적인 것들. PHP 스크립트는 간단한 루프입니다.

for($i = 0; $i < 30000; $i++) 
{ 

     echo 'Hello<br />'; 

} 

위대한 작품입니다. 나는 onClick="javascript:fetch()"이있는 버튼을 누르고 PHP 스크립트를 요청하고 id "ajax"인 div에 30.000 줄의 "Hello"를 출력합니다.

문제는 30.000 루프가 모두 실행될 때까지 기다려야한다는 것입니다. 각 루프 후에 AJAX 요청을 통해 응답을 출력하여 스크립트가 실행되는 동안 목록 종류가 확장되도록하고 싶습니다. 이것이 가능한가? 어떻게하면 좋을까요? 내가 말했듯이, 나는 수색했지만 비어있는 것처럼 보인다. 나는 이것이 엄밀히 말하면 미용 효과가 있다는 것을 알고 있지만, 어떤 충고에 대해서도 큰 도움이 될 것입니다!

는 PHP 설정에서 당신에게

답변

2

해제 출력 버퍼링 감사 또는 각 반복 후 http://www.php.net/manual/en/function.flush.php를 호출합니다.

마이크가 지적한 바와 같이. XHR의 onreadystatechange에서 status == 4을 확인하면 모든 데이터가 전송되었음을 의미합니다. status == 3, 즉 The request is in process; often some partial data is available from the response, but the server isn't finished with its response.

을 확인해야합니다. 서버가 압축을 사용하도록 설정되어 있으면 모든 출력을 버퍼링해서는 안되며 HTML 콘텐츠를 스트리밍 할 수 없다고 지적했습니다.

+1

그럴 수 없습니다. 'http.readystate'가 '4'이면 데이터 전송이 완료된 것입니다. – Mike

+1

또한 gzip 압축이 활성화 된 경우 flush()를 호출해도 아무런 효과가 없다는 것을 언급해야합니다. – Mike

+0

이것은 놀라운 일을했습니다! 전에 플러시 메서드를 시도했지만 스크립트가 모든 루프를 완료 할 때까지 아무 일도 일어나지 않았습니다. 상태가 4가 아닌 3으로 설정되면 이제 각 루프의 모든 내용이 출력됩니다. 분명히 for-loop만으로는 전송 된 모든 업데이트로 인해 브라우저가 멈추었지만 인쇄 할 줄은 적지 만 실행에 더 많은 시간이 소요되는 응용 프로그램 스크립트에서는 작동합니다. 빠른 답장을 보내 주셔서 감사합니다! – Tanax

0

아니요, 불가능합니다. 일부 출력이 전송 된 경우에도 스크립트가 실행되는 동안 데이터를 가져올 수 없습니다. AJAX는 완전한 결과 만 읽을 수 있습니다.

내가이 주제에 대해 묻는 질문보기 : Long Polling/HTTP Streaming General Questions

관련 문제