>  기사  >  백엔드 개발  >  PHP는 새로 고침 버퍼 기능의 사용법을 깊이 이해합니다.

PHP는 새로 고침 버퍼 기능의 사용법을 깊이 이해합니다.

伊谢尔伦
伊谢尔伦원래의
2018-05-24 16:26:353825검색

PHP에서 ob_flush()와 플러시()를 사용하는 방법에 대해

참고: ob_flush()와 플러시() 두 함수는 일반적으로 먼저 ob_flush(), 다음으로 플러시(), 순서대로 사용됩니다. 이 기능은 버퍼를 새로 고치는 것입니다.
리프레시 버퍼를 사용하는 경우와 버퍼를 새로 고치는 이유에 대한 자세한 설명은 다음과 같습니다.

1. 버퍼를 새로 고칠 때

프로그램에서 file_get_contents() 및 file_put_contens() 두 함수가 사용되거나 유사한 "읽기 및 쓰기" 기능이 프로그램에서 실행되거나 브라우저에서 실행될 때 출력 작업 중에 ob_flush() 및 플러시()는 버퍼를 새로 고치는 데 사용됩니다.

2. 버퍼를 새로 고쳐야 하는 이유

file_get_contents() 및 file_put_content()를 예로 들어 설명합니다.

두 가지 함수 file_get_contents()와 file_put_conents()는 각각 데이터 읽기 및 쓰기 작업을 수행합니다. 읽기 속도가 쓰기 속도보다 빠르기 때문에 데이터를 먼저 메모리에 읽은 다음 파일에 씁니다. , 따라서 데이터를 읽었다고 해서 데이터가 기록되었다는 의미는 아닙니다. 이때 읽은 내용이 일시적으로 버퍼(메모리)에 저장된다는 점을 강조할 필요가 있습니다. 쓰기와 쓰기는 매우 빠른 두 가지 작업입니다.

또한 설명을 사용합니다(프로그램이 브라우저에 출력 작업을 수행할 때). 개별 웹 서버 프로그램, 특히 Win32의 웹 서버 프로그램은 프로그램이 종료될 때까지 결과를 브라우저에 보내기 전에 스크립트의 출력을 계속 캐시합니다. 끝. 프로그램이 실행된 후에만 브라우저에 출력되는 것을 원하지 않으면 ob_flush() 및 flash()를 사용하여 캐시를 새로 고칠 수도 있습니다.

사실, 플러시()에는 프로그램이 끝나기 전에 출력하는 또 다른 용도가 있습니다. 즉, 루프가 끝나기 전에 결과의 일부를 브라우저에 출력할 수 있습니다. 이 효과는 비동기 전송 효과와 매우 유사합니다. 아약스.
ob_flush와 플러시의 차이점에 대한 심층적인 이해
매뉴얼의 ob_flush/flush에 대한 설명에는 둘 다 출력 버퍼를 새로 고치고 함께 사용해야 한다고 되어 있어 많은 사람들에게 혼란을 줄 수 있습니다...
사실, 플러시는 다른 개체에서 작동합니다.
ob_* 시리즈 함수는 PHP 자체의 출력 버퍼를 작동합니다.
엄밀히 말하면, 플러시는 이 기능을 수행합니다. PHP가 Apache 모듈(핸들러 또는 필터)로 설치된 경우에만 실제 효과가 있는 경우에만 사용할 수 있습니다. WebServer의 버퍼를 새로 고칩니다(특히 Apache로 간주될 수 있음).
Apache 모듈의 sapi에서 플러시합니다. sapi_module 멤버
함수 포인터 플러시를 호출하고 Apache의 API를 간접적으로 호출합니다. ap_rflush는 Apache의 출력 버퍼를 새로 고칩니다. 물론 설명서에는 이 작업의 결과를 변경할 수 있는 다른 Apache 모듈도 있다고 나와 있습니다.일부 Apache 예를 들어, mod_gzip은 자체적으로 출력 캐싱을 수행할 수 있으며 이로 인해 플러시() 함수에 의해 생성된 결과가 클라이언트 브라우저로 즉시 전송되지 않습니다.
브라우저에서도 수신된 콘텐츠를 표시하기 전에 캐시합니다. 예를 들어, Netscape 브라우저는 개행 문자나 html 태그의 시작 부분을 받을 때까지 콘텐츠를 캐시하고 태그를 받을 때까지 전체 테이블을 표시하지 않습니다.
일부 버전의 Microsoft Internet Explorer는 256바이트를 받은 후에만 페이지를 표시하기 시작하므로 이러한 브라우저가 페이지 콘텐츠를 표시할 수 있도록 일부 추가 공간을 보내야 합니다. 따라서 두 가지를 먼저 사용하는 올바른 순서는 다음과 같습니다. then Flush,
물론 다른 SAPI에서는 Flush를 호출할 수 없지만, 코드의 이식성을 보장하기 위해 함께 사용하는 것을 권장합니다.

buffer ---- Flush()

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

이 두 기능의 사용은 아마도 많은 사람들에게 가장 혼란스러운 문제 일 것입니다. 설명서에 두 기능에 대한 설명도 불분명하고, 두 기능의 차이점도 명확하게 명시되어 있지 않은 것 같습니다. 출력 캐시를 새로 고칩니다. 그러나 기사 시작 부분의 코드에서, 만약 플러시()가 ob_flush()로 대체된다면, 프로그램은 더 이상 올바르게 실행되지 않을 것입니다. 분명히 둘 사이에는 차이가 있지만, 그 중 하나가 다른 기능의 별칭이라고 매뉴얼에 직접 명시하는 것만으로도 충분할 것입니다. 그렇다면 그들 사이의 차이점은 무엇입니까?

캐싱이 활성화되지 않은 경우 스크립트에 의한 콘텐츠 출력은 서버 측에서
출력 대기 중 상태입니다. 플러시()는 출력을 기다리는 콘텐츠를 즉시 클라이언트로 보낼 수 있습니다.

캐시가 켜진 후에는

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

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()을 사용하면 데이터나 다른 작업 없이 서버에 캐시된 데이터가 자동으로 지워집니다.

위 내용은 PHP는 새로 고침 버퍼 기능의 사용법을 깊이 이해합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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