문제

나는 꽤 긴 데이터 마이닝 스크립트를 가지고 있으며, 그 일부에서는 페이지에 정보를 반영합니다 (실제로 Foreach 루프 중에).

그러나 나는 내가 원했던대로 즉시가 아니라 '세그먼트'에서 정보가 찾아 보이고 있음을 알게되었습니다.

내 Echo 이후에 모든 데이터를 브라우저로 전송하기 위해 사용할 수있는 기능이 있습니까?

감사.

도움이 되었습니까?

해결책

당신은 아마 원할 것입니다 flush(). 그러나 PHP는 출력 버퍼링을 사용하고있을 수 있습니다. 이것이 상황을 바꿀 수있는 몇 가지 방법이 있지만 간단히 말해서 flush(), 그 다음에 ob_flush().

다른 팁

각 에코 후에 Flush ()를 사용해 볼 수 있지만 실행중인 웹 서버에 따라 클라이언트에 대한 글을 보장하지는 않습니다.

예, 출력을 1024 바이트로 패딩하면 대부분의 브라우저가 컨텐츠를 표시하기 시작합니다.

그러나 우리는 또한 질문에 대한 @Nobody의 답변에서 배웁니다. "각 'echo` 호출 후 출력을 플러시하는 방법은 무엇입니까?"1024 바이트 브라우저 버퍼링 효과는 브라우저가 페이지의 문자 인코딩을 추측해야 할 때만 발생하며, 이는 적절한 컨텐츠 유형 헤더 (예 : 컨텐츠 유형 : 텍스트/html; charset = utf를 보내면 방지 할 수 있습니다. -8 "), 또는 적절한 HTML 메타 태그를 통해 컨텐츠 숯을 지정하여 모든 브라우저에서 나에게도 잘 작동했습니다.

따라서 기본적으로 필요한 모든 것은 다음과 같습니다.

header('Content-Type: text/html; charset=utf-8');
ob_implicit_flush(true);

추가 패딩 또는 플러싱에 대한 요구 사항이 없으므로 코드에 큰 화장품 이점이 있습니다! 물론 콘텐츠 전에 헤더를 보내야하며 출력 버퍼링이 진행되지 않도록해야합니다.

문제가 확실히 해결되었습니다! 제발 (+1) @다른 질문에 대한 답변이 당신을 위해 작동한다면 아무도 대답하지 않습니다. 여전히 문제가 발생하지만 암시 적 플러싱이 올바르게 작동하는 것을 막을 수있는 다른 특정 상황에 대한 다른 질문에 대한 답을 확인하는 것이 좋습니다.

또한 응답 본문에 256 또는 1024 바이트와 같은 특정 양의 데이터가 포함될 때까지 일부 브라우저는 아무것도 표시하지 않습니다. 나는 페이지 상단 근처에 1024 자 긴 주석을 가진 패드 데이터 전에 응용 프로그램을 보았습니다. 약간의 해킹이지만 필요합니다.

이것은 Internet Explorer 및 Safari IIRC에 적용됩니다.

그래서,

  • 첫 번째 플러시 인 경우 최소 1024 바이트 SOFAR (HTTP 헤더 제외)를 출력해야합니다.
  • FLUSH () 호출
  • 출력 버퍼링이 있는지 확인할 수 있다면 OB_FLUSH ()를 발행하십시오.

나는 그냥 사용하는 것을 좋아합니다

while (ob_get_level()) ob_end_flush();

어딘가에서 내 스크립트가 시작될 때

flush();

플러시하고 싶을 때마다. 이것은 스크립트 전에 설정된 경우에도 출력 버퍼링을 전혀 원하지 않는다고 가정합니다 (예 : php.ini 또는 htaccess 구성).

이와 같은 것을 사용하여 출력을 크게 보내도록 할 수 있어야합니다. 출력을 전송하려는 코드의 일부에 넣으십시오.

flush();
ob_flush();

휴! 마침내 Google Chrome의 버퍼 문제에 대한 답변을 찾았습니다! 올바른 방향으로 추진해 주신 Boysmakesh에게 감사드립니다. 여기에 내가 사용하는 기능은 다음과 같습니다.

function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}

그리고 이것이 내가 그것을 부르는 방법입니다.

show_view('global', 'header'); // Echos the <html><head>... tags and
                               // includes JS and CSS.

show_view('global', 'splash_screen'); // Shows a loading image telling
                                      // the user that everything's okay.

buffer_flush(); // Pretty obvious. At this point the loading view shows
                // up on every browser i've tested (chrome, firefox,
                // IE 7 & 8)

show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5
                             // times and calls buffer_flush() each time.

show_view('global', 'footer'); // End the html page and use JQuery to
                               // fade out the loading view.

Chrome에서 이것을 완벽하게 해결하려면 다음을 시도하십시오.

$i = 0;
$padstr = str_pad("",512," ");
echo $padstr;

while ($i <= 4){
    $padstr = str_pad("",512," ");
    echo $padstr;
    echo "boysmakesh <BR> ";
     flush();
    sleep(2);
    $i = $i + 1;
}

EE는 각 에코를 보내기 전에 512 바이트를 보내고 있습니다. 넣는 것을 잊지 마십시오 <BR> 컨텐츠가 끝나기 전에 플러시됩니다. 그렇지 않으면 크롬에서는 작동하지 않지만 IE에서 작동합니다.

우리가 패딩하는 데이터는 브라우저 종속입니다. 일부 브라우저의 경우 256 바이트가 있지만 일부는 1024 바이트가 필요합니다. 크롬의 경우 512입니다.

ignore_user_abort(TRUE); // run script in background
set_time_limit(0); // run script forever
$interval=150000;
$i = 0;

if(
  strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or
  strpos($_SERVER["HTTP_USER_AGENT"], "WebKit")
){
  # important to change browser into quirks mode
  echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
}

function buffer_flush(){
    echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
    for ( $i = 0; $i < 5; $i++ )
        echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";

    while ( ob_get_level() )
        ob_end_flush();

    if(ob_get_length()){
        @ob_flush();
        @flush();
        @ob_end_flush();
    }
    @ob_start();
}

ob_start(); 

do{

  if($i<10){
    buffer_flush(); 
    echo ". ";    
    buffer_flush(); 
    usleep($interval);

  } else {
    echo sprintf("<pre>%s</pre>", print_r($_SERVER,true));
    break;
  }

  $i++;

}while(true);

IIS 7에서 PHP 5.5 실행, 즉 11 (Win Server)이 파일의 오프닝 라인으로 작동했습니다. 참고 헤더가 헤더가 이미 작성된 오류를 일으키기 전에 while 문을 두십시오.

header('Content-Type: text/html; charset=utf-8');
while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);

스크립트에서 OB_FLUSH ()에 대한 추가 참조는 버퍼가 오류가 없습니다.

파일을 처리하고 브라우저에 SQL 문을 보낼 때 이것은 제대로 작동했지만 DB (MS Server 2008)를 연결했을 때 스크립트가 완료 될 때까지 입력이 반환되지 않았습니다.

이 조합은 마침내 Thomasrutter의 대답을 바탕으로 저에게 효과가있었습니다.

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top