>  기사  >  백엔드 개발  >  PHP는 데이터를 한 줄씩 출력하고 두 가지 일반적인 버퍼링 문제를 해결합니다.

PHP는 데이터를 한 줄씩 출력하고 두 가지 일반적인 버퍼링 문제를 해결합니다.

WBOY
WBOY원래의
2016-08-08 09:30:30818검색

그는 다양한 인터넷 기술에 관심이 많으며 장황하고 강박 장애를 동반하는 경우가 많습니다. 기사가 도움이 된다고 생각되면 자주 업데이트하십시오. 나를 따르라. "짙은 파란색 낫"을 표시하십시오


1. 문제가 발생했습니다

저는 이런 두 가지 상황을 겪어본 적이 없습니다.

  1. 사장님은 데이터베이스에 있는 모든 데이터를 브라우저에 표시하라고 하십니다. 비교하자면, 사장님의 요구 사항은 페이징을 사용할 수 없다는 것이므로, 1,000개의 데이터를 출력하고 이를 루프로 직접 인쇄하는 것은 문제가 없지만, 수백만 개의 데이터가 있다면 어떻게 될까요? 브라우저가 바로 멈춥니다. 자리를 떠나 커피 한잔 마시고 화장실에 갔다가 접수원과 장시간 대화를 나누다가 돌아오면 브라우저에 "프로그램이 응답하지 않습니다."라는 메시지가 나타납니다. 당신은 무엇을 해야 합니까?
  2. 사장님께서 홈페이지의 다운로드 링크를 개선해 달라고 부탁하셨습니다. 파일을 다운로드하려면 마우스 왼쪽 버튼을 직접 클릭해야 합니다(일부 파일 형식의 경우, 직접 마우스 왼쪽 버튼을 클릭하면 파일이 열립니다. 많은 웹사이트에서는 "마우스 오른쪽 버튼을 클릭하여 다른 이름으로 저장"하라는 메시지가 표시됩니다. 이를 쉽게 구현하기 위해 헤더 기능과 readfile 기능을 사용했습니다. 그러나 온라인에 접속한 후 파일이 너무 크면 브라우저가 여전히 작동하지 않는 것을 발견했습니다. 이번에는 상사가 커피를 사주고 싶어합니다. 어떻게 해야 합니까?

그럼 위의 두 가지 상황에 직면하시거나, 차후에 이런 문제가 발생할 가능성이 있다면 표시해 두시면 다음번에 빠르게 해결할 수 있을 것입니다.

2. 원칙

본점으로 이동합니다.

다음은 PHP 출력 제어 출력 버퍼

의 그랜드 런칭입니다. 🎜>

먼저 다음 코드의 효과를 시도해 보세요

<?php
if (ob_get_level() == 0){ ob_start() }else{ exit(0);};//开始缓冲

for ($i = 0; $i<10; $i++){
    echo "Line to show.\n<br />";//不直接输出,先存入缓冲区中
    ob_flush();//将缓冲区的数据输出出来
    flush();//将缓冲区的数据输出出来
    sleep(2);//暂停两秒
}

echo "Done.";

ob_end_flush();//关闭并清理缓冲区

PHP에서도 이런 게으른 기능을 구현할 수 있을 거라고는 예상하지 못했습니다. 로딩 기능, 아주 멋진 느낌이지 않나요?

PHP는 데이터를 출력하기 전에 버퍼(Buffer)에 넣어두는 것이 원칙입니다. 캐시와 혼동됩니다.

이것의 장점은 한편으로는 지연된 로딩과 유사한 멋진 효과를 얻을 수 있는 동시에 서버와 클라이언트에 대한 부담을 줄일 수도 있다는 것입니다. 그렇지 않으면 빅데이터를 출력할 때 메모리가 부족해지는 상황이 발생합니다.

참고: ob_flush()flush()는 버퍼 데이터를 플러시하는 데 사용되지만 공식 권장 사항 을 사용하세요. 함께 사용하면 대부분의 WebServer에서는 ob_flush()만으로 버퍼를 플러시할 수 있지만 Apache와 같은 일부 경우에는 때때로 flush()를 호출해야 할 수도 있습니다. , 따라서 코드의 이식성을 위해 ob_flush() 바로 뒤에 flush()를 추가하는 것이 좋습니다.

이제 원리를 알았으니, 처음에 언급한 두 가지 문제를 풀어보겠습니다.

3. 한 페이지에 수백만 개의 데이터가 출력되지 않는 문제 해결

<?php
ob_start();
$data = [1,2,3,4,5,6,7,8,9,10];//实际数据更多,为方便距离假设浏览器一次输出10条会卡死
$per = 3;//每次输出3条,可以改成1000 

for ($i = 0;$i < count($data); $i+= $per){
    for($j = $i; $j < $i + $per && $j <count($data); $j++){
        echo $data[$j];
    }
    ob_flush();
    flush();
    sleep(2);
}

echo "Done.";

ob_end_flush();

4 .헤더 파일이 너무 커서 다운로드가 어려울 때 멈추는 문제 해결

<?php
header('Content-type: application/txt');//输出类型
ob_start();

$data = "qwertyuioasdfghjkl";//文件内容,file_get_contents($file)
$per = 15;//每次输出15个字符,可以改成1000或更大 


for ($i = 0;$i < strlen($data); $i+= $per){
    for($j = $i; $j < $i + $per && $j <strlen($data); $j++){
        echo $data[$j];
    }
    sleep(2);
    ob_flush();
    flush();
}


echo "Done."; 
    
ob_end_flush(); 

위 내용은 PHP를 소개하여 데이터를 한 줄씩 출력하고 내용의 측면을 포함하여 두 가지 일반적인 버퍼링 문제를 해결합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.