PHP에서 플러시()와 ob_flush() 함수의 사용법 차이에 대한 자세한 설명

伊谢尔伦
풀어 주다: 2023-03-11 10:04:02
원래의
1263명이 탐색했습니다.

1. 버퍼 ---- 플러시()

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


2.php output_buffering --- ob_flush()
기본적으로 php buffer입니다. 활성화되어 있으며, 버퍼의 기본값은 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()의 기능은 원래 출력 캐시에 저장되어 있던 내용을 꺼내어 출력 대기 상태로 설정하는 것이지만, 클라이언트에 직접 전송되지는 않습니다. 이 경우 먼저 ob_flush()를 사용해야 합니다. 그런 다음 flash() 를 사용하면 클라이언트는 즉시 스크립트의 출력을 얻을 수 있습니다.

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

4. 출력 버퍼링 기능
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
은 출력 버퍼링 메커니즘을 활성화합니다. 활성화되면 스크립트 출력은 더 이상 브라우저로 직접 전송되지 않고 일시적으로 PHP 버퍼 메모리 영역에 기록됩니다.
php는 기본적으로 출력 버퍼링 메커니즘을 활성화하지만, ob_start() 함수를 호출하면 데이터 출력 버퍼링 값이 충분히 큰 값으로 확장됩니다. $chunk_size를 지정하여 output_buffering 값을 지정할 수도 있습니다. $chunk_size의 기본값은 0입니다. 이는 PHP 버퍼의 데이터가 스크립트가 끝날 때까지 브라우저로 전송되지 않음을 의미합니다. $chunk_size의 크기를 설정하면 버퍼의 데이터 길이가 이 값에 도달하는 한 버퍼의 데이터가 브라우저로 전송된다는 의미입니다.
물론 $ouput_callback을 지정하면 버퍼에 있는 데이터를 처리할 수 있습니다. 예를 들어 ob_gzhandler 함수는 버퍼의 데이터를 압축한 다음 브라우저로 보냅니다.
세 번째 매개변수: 캐시를 지울지 여부, 선택 사항, 기본값은 true입니다. false로 설정하면 스크립트 실행이 끝나기 전에 캐시가 지워지지 않습니다.
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을 사용하여 콜백 함수에서 작업 디렉터리를 수동으로 다시 수정하는 것입니다. 이 Dots는 자주 접하지 않는 것 같으니, 마주치면 반드시 매뉴얼을 확인하시기 바랍니다.

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을 사용하여 콜백 함수에서 작업 디렉터리를 수동으로 다시 수정하는 것입니다. 이 Dots는 자주 접하지 않는 것 같으니, 마주치면 반드시 매뉴얼을 확인하시기 바랍니다.

위 내용은 PHP에서 플러시()와 ob_flush() 함수의 사용법 차이에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿