PHP 프로그래밍에서 출력 버퍼링은 페이지 컨텐츠의 출력 타이밍을 효과적으로 제어하여 성능 및 사용자 경험을 향상시킬 수있는 강력한 도구입니다. 특히 페이지 컨텐츠를 점차적으로 출력 해야하는 경우 OB_START 와 OB_FLUSH는 일반적으로 사용되는 두 가지와 중요한 기능입니다. 개발자는 출력 전에 페이지 컨텐츠를 버퍼링 할 수있게하고 브라우저를 단계별 또는 즉시 브라우저에 출력 할 수 있습니다. 이는 대규모 데이터 처리 또는 동적으로 생성 된 콘텐츠가 필요한 페이지에 특히 중요합니다.
ob_start ()
OB_START ()는 출력 버퍼를 시작합니다. 출력 버퍼는 스크립트가 실행되거나 OB_FLUSH ()가 호출 될 때까지 PHP 스크립트의 모든 출력 내용을 메모리의 버퍼에 저장합니다. 기본적으로 PHP는 출력을 브라우저로 직접 보내지 만 OB_START ()를 사용하면이 동작을 일시 중지하고 먼저 버퍼에 모든 것을 저장할 수 있습니다.
ob_flush ()
OB_FLUSH () 함수는 버퍼의 내용을 즉시 브라우저에 출력하는 데 사용됩니다. 이는 컨텐츠를 단계별로 출력 해야하는 시나리오 또는 장기 실행 페이지의 진행 피드백에 특히 유용합니다. OB_FLUSH ()를 호출하면 버퍼의 내용이 플러시되고 스크립트가 실행되지만 출력 버퍼의 수명주기는 OB_end_flush () 로 호출 될 때까지 종료되지 않습니다.
OB_START () 및 OB_FLUSH ()를 합리적으로 사용하면 페이지가로드되기 전에 전체 페이지가 생성되기를 기다리는 브라우저를 피하면서 점진적인 페이지 출력을 구현할 수 있습니다. 다음은이 두 기능을 결합하여 콘텐츠를 단계별로 출력하는 방법을 보여주는 간단한 예입니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 출력 버퍼링을 켭니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-comment">// 다량의 데이터를 생성하는 프로세스를 시뮬레이션합니다</span></span><span>
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> <= </span><span><span class="hljs-number">5</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-comment">// 현재 부분의 내용을 생성하십시오</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Processing step <span class="hljs-subst">$i</span></span></span><span>...\n";
</span><span><span class="hljs-comment">// 버퍼를 강제로 새로 고칩니다,현재 출력을 브라우저로 보냅니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_flush</span></span><span>();
</span><span><span class="hljs-comment">// 잠시 일시 중지하십시오,장기 처리 프로세스를 시뮬레이션하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>);
}
</span><span><span class="hljs-comment">// 버퍼링 된 출력을 종료하고 나머지 콘텐츠를 보냅니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">ob_end_flush</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
출력 버퍼링 켜기 : OB_START () 출력 버퍼링을 시작하여 모든 출력 컨텐츠가 브라우저로 즉시 전송되지 않도록합니다.
긴 처리 시뮬레이션 : 루프 용 으로 각 반복은 텍스트를 생성하고 Echo를 통해 출력을 생성합니다. 일반적으로 이러한 내용은 버퍼에 캐시됩니다.
단계별 출력 : OB_FLUSH ()를 사용하여 버퍼의 내용을 브라우저로 강제합니다. 이런 식으로 스크립트가 계속 실행 되더라도 사용자는 여전히 출력 내용을 볼 수 있습니다.
시뮬레이션 지연 : 수면 (2)은 처리 중에 시간 지연을 시뮬레이션하는 것이며 사용자는 단계별 출력의 효과를 볼 수 있습니다.
최종 버퍼링 출력 : OB_END_FLUSH () 는 나머지 컨텐츠를 출력하고 버퍼를 닫아 모든 컨텐츠가 브라우저로 전송되도록합니다.
다량의 데이터 처리 : 많은 양의 데이터를 처리 할 때 버퍼링 메커니즘이없는 경우 페이지는 오랫동안 사용자 경험이 열악한 결과를 표시하기 위해 오랫동안 기다릴 수 있습니다. OB_START 및 OB_FLUSH를 사용하면 브라우저가 점차 데이터를 수신하고 상호 작용을 향상시킬 수 있습니다.
장기 실행 작업 : 파일 가져 오기, 보고서 생성 및 기타 작업과 같은 몇 분 이상이 걸릴 수 있습니다. 단계별 출력을 통해 사용자는 대기를 계속 표시하는 대신 진행 상황을 볼 수 있습니다.
동적 콘텐츠 생성 : 예를 들어, 뉴스, 댓글 또는 사용자 생성 컨텐츠 및 기타 시나리오를 점차로드하면 OB_START 및 OB_FLUSH는 페이지의 응답 성을 유지하고 서버 측 성능을 향상시킬 수 있습니다.
이점:
사용자 경험 향상 : 장기 실행 스크립트는 점진적인 출력을 통해 사용자의 대기를 피하고 페이지 응답을 유지할 수 있습니다.
메모리 풋 프린트 감소 : 메모리 자원을 저장하는 한 번에 메모리에로드를 피하기 위해 많은 양의 데이터가 단계별로 출력됩니다.
보다 유연한 제어 출력 : 콘텐츠가 브라우저로 전송되는 시점을 정확하게 제어하여 개발 유연성과 사용자 정의 가능성을 향상시킵니다.
참고 :
브라우저 캐싱 문제 : OB_FLUSH를 사용하더라도 일부 브라우저는 일부 컨텐츠를 캐시하여 출력이 예상보다 나빠질 수 있습니다. 브라우저 캐시는 플러시 () 함수를 통해 더 새로 고침해야 할 수 있습니다.
버퍼 크기 : PHP의 출력 버퍼에는 크기 제한이 있습니다. 버퍼가 너무 크거나 너무 많은 데이터가 출력되면 성능 문제가 발생할 수 있습니다. 버퍼 크기는 합리적으로 관리해야합니다.
출력 시퀀스 문제를 일으킬 수 있습니다 : 동시 요청 또는 멀티 스레드 환경에서 버퍼링 출력은 출력 시퀀스 혼동을 유발할 수 있습니다. 명확한 논리를 보장하고 부적절한 버퍼 관리로 인한 문제를 피하십시오.
OB_START () 및 OB_FLUSH () 를 결합하면 PHP 페이지 컨텐츠의 점진적인 출력을 효과적으로 제어하고 사용자 경험을 최적화하며 페이지 성능을 향상시킬 수 있습니다. 출력 버퍼링 메커니즘을 합리적으로 설계함으로써 장기 작업을 수행 할 때 처리 중에 페이지가 지속적으로 업데이트되도록하고 페이지가 오랫동안 "고정"되는 것을 피할 수 있습니다. 동시에 개발자는 출력 리듬을 적절하게 제어하여 성능과 응답 속도의 균형을 향상시킬 수 있습니다. 이러한 기술은 많은 양의 데이터 처리, 동적 콘텐츠 생성 또는 장기 페이지가 필요한 페이지에 특히 적합합니다.