>  기사  >  php教程  >  PHP 플러시()와 ob_flush()의 차이점에 대한 자세한 설명

PHP 플러시()와 ob_flush()의 차이점에 대한 자세한 설명

高洛峰
高洛峰원래의
2016-12-22 16:29:031118검색

uffer ---- 플러시()

버퍼는 메모리 주소 공간입니다. Linux 시스템의 기본 크기는 일반적으로 1개의 메모리 페이지인 4096(1kb)입니다. 주로 속도가 동기화되지 않은 장치 또는 우선 순위가 다른 장치 간의 데이터 전송 영역을 저장하는 데 사용됩니다. 버퍼를 통해 프로세스는 서로 덜 기다릴 수 있습니다. 다음은 보다 일반적인 예입니다. 파일을 편집하기 위해 텍스트 편집기를 열 때 문자를 입력할 때마다 운영 체제는 해당 문자를 디스크에 직접 쓰지 않고 먼저 버퍼에 씁니다. 버퍼가 가득 차면 버퍼에 있는 데이터가 디스크에 기록됩니다. 물론 커널 함수 플러시()가 호출되면 버퍼에 있는 더티 데이터를 디스크에 다시 쓰는 것이 필수입니다.
마찬가지로 echo와 print가 실행되면 출력이 즉시 클라이언트 브라우저로 전송되어 tcp를 통해 표시되는 것이 아니라, 데이터가 php 버퍼에 기록됩니다. php 출력_버퍼링 메커니즘은 tcp 버퍼 이전에 새 대기열이 설정되고 데이터가 대기열을 통과해야 함을 의미합니다. PHP 버퍼가 가득 차면 스크립트 프로세스는 PHP 버퍼의 출력 데이터를 시스템 커널에 전달하고 표시를 위해 TCP를 통해 브라우저에 전달합니다. 따라서 데이터는 순서대로 이 위치에 기록됩니다. echo/pring -> php buffer -> tcp buffer -> 다음으로 PHP 버퍼가 활성화되며, 버퍼의 기본값은 4096, 즉 1kb입니다. php.ini 구성 파일에서 output_buffering 구성을 찾을 수 있습니다. echo, print 등으로 사용자 데이터를 출력하면 출력 데이터가 php output_buffering에 기록됩니다. . 보여주다. ob_start()를 통해 PHP 출력_버퍼링 메커니즘을 수동으로 활성화할 수도 있습니다. 그러면 출력이 1kb의 데이터를 초과하더라도 데이터가 실제로 tcp로 전달되지 않고 브라우저로 전달됩니다. 왜냐하면 ob_start()가 PHP 버퍼 공간을 다음과 같이 설정하기 때문입니다. 충분히 커야 합니다. 스크립트가 끝나거나 ob_end_flush 함수가 호출될 때까지 데이터는 클라이언트 브라우저로 전송되지 않습니다.
캐싱이 활성화되지 않은 경우 스크립트에 의해 출력된 콘텐츠는 서버 측에서 출력을 기다리고 있습니다. 플러시()는 출력을 기다리는 콘텐츠를 즉시 클라이언트로 보낼 수 있습니다.

캐시가 켜진 후에는 스크립트에 의해 출력된 콘텐츠가 출력 캐시에 저장됩니다. 이때, 플러시()를 직접 사용하면 콘텐츠가 없습니다. 클라이언트에게 전송됩니다. ob_flush()의 기능은 원래 출력 캐시에 있던 내용을 꺼내어 출력 대기 상태로 설정하는 것이지만, 클라이언트에 직접 전송되지는 않습니다. 이 경우 ob_flush()를 사용해야 합니다. 먼저 플러시()를 수행합니다. 클라이언트 터미널은 즉시 스크립트의 출력을 얻을 수 있습니다.

1. 플러시 및 ob_flush의 올바른 순서는 다음과 같이 ob_flush를 먼저 사용한 다음 플러시하는 것입니다.
ob_flush();
flush();
운영 체제가 웹 서버는 Windows 시스템이므로 순서가 바뀌거나 ob_flush()를 사용하지 않아도 문제가 없습니다. [확인 예정] 그러나 Linux 시스템에서는 출력 버퍼를 새로 고칠 수 없습니다.

출력 버퍼링 기능
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
output_buffering 메커니즘을 활성화합니다. 활성화되면 스크립트 출력은 더 이상 브라우저로 직접 전송되지 않고 일시적으로 PHP 버퍼 메모리 영역에 기록됩니다.
php는 기본적으로 출력 버퍼링 메커니즘을 활성화하지만, ob_start() 함수를 호출하면 데이터 출력 버퍼링 값이 충분히 큰 값으로 확장됩니다. $chunk_size를 지정하여 output_buffering 값을 지정할 수도 있습니다. $chunk_size의 기본값은 0입니다. 이는 PHP 버퍼의 데이터가 스크립트가 끝날 때까지 브라우저로 전송되지 않음을 의미합니다. $chunk_size의 크기를 설정하면 버퍼의 데이터 길이가 이 값에 도달하는 한 버퍼의 데이터가 브라우저로 전송된다는 의미입니다.
물론 $ouput_callback을 지정하면 버퍼에 있는 데이터를 처리할 수 있습니다. 예를 들어, ob_gzhandler 함수는 버퍼의 데이터를 압축한 다음 이를 브라우저로 보냅니다.
세 번째 매개변수: 캐시 지우기 여부, 선택 사항, 기본값은 true입니다. false로 설정하면 스크립트 실행이 끝나기 전에 캐시가 지워지지 않습니다.
2.ob_get_contents
PHP 버퍼에 있는 데이터 사본을 가져옵니다. ob_end_clean() 함수가 호출되기 전에 이 함수를 호출해야 한다는 점은 주목할 가치가 있습니다. 그렇지 않으면 ob_get_contents()는 null 문자를 반환합니다.

ob_get_contents()를 사용하면 서버에서 캐시된 데이터를 문자열 형식으로 얻을 수 있습니다.
ob_end_flush()를 사용하면 캐시된 데이터를 출력하고 캐시를 닫을 수 있습니다.
ob_end_clean()을 사용하면 데이터나 다른 작업 없이 서버에 캐시된 데이터가 자동으로 지워집니다.
서버측 캐시는 스택되어 있습니다. 즉, ob_start()를 활성화한 후 이를 닫기 전에 그 안에 있는 다른 캐시 ob_start()도 활성화할 수 있다는 의미입니다.

그러나 캐시를 끄는 작업 횟수와 캐시를 켜는 작업 횟수가 동일한지도 확인해야 합니다.
ob_start()는 캐시된 데이터를 처리하기 위한 콜백 함수를 지정할 수 있습니다. 하나의 ob_start()가 다른 ob_start() 내에 중첩된 경우 외부 ob_start()에 숫자 A가 있고 내부 ob_start() ) 숫자가 있다고 가정합니다. B입니다. 각각 콜백 함수 functionA와 functionB가 있습니다. 그런 다음 캐시 B의 데이터가 출력되면 먼저 funcitonB 콜백 함수에 의해 처리된 다음 처리를 위해 외부 functionA 콜백 함수로 전달됩니다. 클라이언트에 출력됩니다.

또한 설명서에는 Apache와 같은 일부 웹 서버의 경우 콜백 함수를 사용하면 프로그램의 현재 작업 디렉터리가 변경될 수 있다고 나와 있습니다. 해결 방법은 콜백 함수에서 작업 디렉터리를 수동으로 다시 수정하는 것입니다. , chdir 기능을 사용하는 경우는 자주 발생하지 않는 것 같습니다.

3. ob_end_flush 및 ob_end_clean
이 두 기능은 다소 유사하며 둘 다 ouptu_buffering 메커니즘을 끕니다. 그러나 차이점은 ob_end_flush는 PHP 버퍼의 데이터를 클라이언트 브라우저로 플러시(플러시/전송)만 하는 반면, ob_clean_clean은 PHP 버퍼의 데이터를 지우(지우기)만 클라이언트 브라우저로 보내지 않는다는 것입니다.

ob_end_flush가 호출되기 전에는 PHP 버퍼의 데이터가 여전히 존재하며 ob_get_contents()는 여전히 PHP 버퍼의 데이터 복사본을 얻을 수 있습니다.

ob_end_flush()를 호출한 후 ob_get_contents()는 빈 문자열을 가져오고 브라우저는 출력을 받을 수 없습니다. 즉, 출력이 없습니다.

ob_get_contents()를 사용하면 서버에서 캐시된 데이터를 문자열 형식으로 얻을 수 있습니다. ob_end_flush()를 사용하면 캐시된 데이터를 출력하고 캐시를 닫습니다.
ob_end_clean()을 사용하면 데이터나 다른 작업 없이 서버에 캐시된 데이터가 자동으로 지워집니다.
서버측 캐시는 스택형입니다. 즉, ob_start()를 활성화한 후 이를 닫기 전에 그 안에 있는 다른 캐시 ob_start()를 열 수 있다는 의미입니다. 그러나 캐시를 켜는 작업 수만큼 캐시를 끄는 작업도 있는지 확인해야 합니다.
ob_start()는 캐시된 데이터를 처리하기 위한 콜백 함수를 지정할 수 있습니다. 하나의 ob_start()가 다른 ob_start() 내에 중첩된 경우 외부 ob_start()에 숫자 A가 있고 내부 ob_start() ) 숫자가 있다고 가정합니다. B입니다. 각각 콜백 함수 functionA와 functionB가 있습니다. 그런 다음 캐시 B의 데이터가 출력되면 먼저 funcitonB 콜백 함수에 의해 처리된 다음 처리를 위해 외부 functionA 콜백 함수로 전달됩니다. 클라이언트에 출력됩니다.

또한 설명서에는 Apache와 같은 일부 웹 서버의 경우 콜백 함수를 사용하면 프로그램의 현재 작업 디렉터리가 변경될 수 있다고 나와 있습니다. 해결 방법은 콜백 함수에서 작업 디렉터리를 수동으로 다시 수정하는 것입니다. , chdir 기능을 사용하는 경우는 자주 발생하지 않는 것 같습니다.


PHP 플러시()와 ob_flush()의 차이점에 대한 더 자세한 설명은 PHP 중국어 홈페이지를 참고해주세요!


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