버퍼는 메모리 주소 공간으로 리눅스 시스템의 기본 크기는 보통 4096(4kb)이다.속도가 동기화되지 않은 장치나 우선순위가 다른 장치 간의 데이터 전달 영역을 저장하는 데 주로 사용된다.
버퍼를 통해 프로세스 간 상호 대기를 줄일 수 있다.
예를 들어, 텍스트 편집기를 열고 문자를 입력하면 디스크에 바로 쓰이지 않습니다.버퍼에 저장해 놓고 버퍼를 하나 채울 때 버퍼의 내용을 적는다.디스켓에 넣다.
물론 플러시를 사용해 버퍼의 데이터를 강제로 디스크에 쓸 수도 있다.
php, 예를 들어 echo, print의 경우 tcp를 통해 곧바로 출력이 브라우저로 전달되지는 않는다.php버퍼에 데이터를 쓰는 것이다.php buffer가 가득 차면TCP를 통해 브라우저로 전달된다.
echo/print - > php output_buffer - > tcp buffer - > browser
php output_buffering
기본적으로 php 버퍼는 켜져 있고, 기본값은 4096(4kb)이다.output_buffering 구성은 php.ini에서 찾을 수 있다.버퍼가 꽉 찬 것을 알고 브라우저로 보냅니다.
ob_start() 를 설정할 수도 있습니다. 기본(4kb)을 초과해도 바로 브라우저로 전송되지 않으며, 스크립트가 완료될 때까지 실행하거나 ob_end_flush 메서드를 호출하면 출력됩니다.브라우저로 나오다.
1.output_buffering=4096, 출력이 적은 데이터(1개 미만)
<?php
for($i=0; $i<10; $i++){
echo $i.'<br>';
sleep(2);
}
?>
실행결과:모든 스크립트를 실행한 후에 출력합니다.데이터가 하나의 버퍼크기가 되지 않기 때문입니다.
2.output_buffering=4096, 출력이 적은 데이터(buffe 하나 미만)r),output_buffering을 닫고 php.ini의 output_buffering=0 수정
<?php
for($i=0; $i<10; $i++){
echo $i.str_repeat(" ",500).'<br>'; // 256바이트(또는 그 이상)가 받아들여질 때 비로소 이 페이지를 표시하기 때문에, 이 브라우저들이 페이지를 표시할 수 있도록 공간을 추가로 보내야 한다
flush();
sleep(1);
}
?>
실행결과: php buffering이 비활성화되어 스크립트가 실행될 때까지 기다리지 않고 출력할 수 있으며, 데이터는 php buffer에 머무르지 않고 간헐적으로 출력되는 것을 볼 수 있습니다.echo- > tcp buffer - > browser
3.output_buffering=4096일 때 큰 데이터(buffer 하나 이상)를 출력하며 ob_start()를 사용하지 않습니다
<?php
for($i=0; $i<10; $i++){
echo file_get_contents('f.txt').$i.'<br>';
sleep(1);
}
?>
실행 결과: f.txt는 4kb보다 큰 파일입니다. 버퍼 기본값보다 커서 버퍼 공간이 부족합니다. 버퍼 하나를 채울 때마다 출력을 하기 때문에 간헐적인 출력을 볼 수 있습니다.
4.output_buffering=4096으로 큰 데이터(buffer 하나 이상)를 출력할 경우 ob_start()를 사용합니다
<?php
ob_start();
for($i=0; $i<10; $i++){
echo file_get_contents('f.txt').$i.'<br>';
sleep(1);
}
?>
실행결과:ob_start()를 사용하였으므로 buffer에 충분한 공간이 마련되므로 스크립트가 실행된 후에 출력됩니다.
output_buffering 방법
1.ob_start
output_buffering 메커니즘을 활성화하여 활성화하면 스크립트가 브라우저로 직접 출력되지 않고 php bufferin에 일시적으로 기록됩니다.g 영역. 스크립트가 실행된 후에야 보냅니다.
2.ob_get_contents
php buffering의 데이터를 가져옵니다. 주의: ob_end_clean() 앞에 호출해야 합니다. 그렇지 않으면 빈 문자만 얻을 수 있습니다.
3.ob_end_flush와 ob_end_clean
ob_end_flush는 php buffering의 데이터를 출력하지만 비우지 않습니다.
ob_end_clean은 출력하지 않으며 php buffering의 데이터만 비웁니다.
주의:
ob_flush/flush의 설명서에 있는 설명은 모두 출력 버퍼를 새로 고치는 것이고, 또한 함께 사용해야 하기 때문에 많은 사람들이 미혹하게 될 것입니다.
사실, 그 둘은 조작 대상이 다르기 때문에 어떤 경우에는 flush가 전혀 일을 하지 않습니다..
ob_*계열 함수는 PHP 자체를 조작하는 출력 버퍼이다.
따라서 ob_flush는 PHP 자체를 새로 고치는 버퍼이다.
flush, 엄밀히 말하면 이것은 PHP가 apache의 Module(핸들러 또는 filter)로 설치되었을 때만, 실제 효과가 있습니다. 웹서버를 새로 고치는 버퍼입니다..
apache module의 sapi에서 flush는 sapi_module의 flush 멤버 함수 포인터를 호출하여 간접적으로 변조한다.apache의 api: ap_rflush로 apache의 출력 버퍼를 새로 고칩니다.매뉴얼에는 APACH의 다른 모듈도 있다고 나와 있는데, 그래도이 동작의 결과를 바꿀 수 있는...
mod_gzip과 같은 Apache의 일부 모듈은 자체적으로 출력 캐시를 수행할 수 있으며, 이로 인해 flush() 함수의 결과가 즉시 고객에게 전송되지 않습니다.클라이언트 브라우저.
심지어 브라우저도 디스플레이가 뜨기 전에 수신된 내용을 캐시한다.예를 들어 Netscape 브라우저는 줄 바꿈이나 HTML 태그의 시작을 받기 전에 내용을 캐시합니다또한, </table> 태그를 받을 때까지 전체 테이블이 표시되지 않습니다.
일부 버전의 Microsoft Internet Explorer는 256바이트를 받은 후에만 페이지를 표시합니다. 반드시이러한 브라우저가 페이지 내용을 표시할 수 있도록 추가 공간을 보내야 합니다.
그래서 이 둘을 제대로 사용하는 순서는. 먼저 ob_flush, 그 다음에 flush.
물론 다른 sapi에서는 flush를 호출하지 않아도 되지만, 단지 당신의 코드의 이식성을 보장하기 위해 함께 사용하는 것을 추천합니다
'개발 꿀팁 > PHP' 카테고리의 다른 글
php fsockopen GET/POST를 이용한 양식 제출 및 파일 업로드 (0) | 2022.08.19 |
---|---|
이미지 Etag를 이용한 사용자 판단 (0) | 2022.08.19 |
동일한 도메인이 서로 다른 IP에 대응하여 지정된 호스트 파일의 내용에 접근하는 방법 (0) | 2022.08.19 |
php 변수의 이름을 가져오는 방법 (0) | 2022.08.19 |
HTTP 204와 205 애플리케이션 (0) | 2022.08.19 |