그는 다양한 인터넷 기술에 관심이 많으며 장황하고 강박 장애를 동반하는 경우가 많습니다. 기사가 도움이 된다고 생각되면 자주 업데이트하십시오. 나를 따르라. "짙은 파란색 낫"을 표시하십시오
1. 문제가 발생했습니다
저는 이런 두 가지 상황을 겪어본 적이 없습니다.
그럼 위의 두 가지 상황에 직면하시거나, 차후에 이런 문제가 발생할 가능성이 있다면 표시해 두시면 다음번에 빠르게 해결할 수 있을 것입니다.
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는 데이터를 출력하기 전에 버퍼(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();