>  기사  >  백엔드 개발  >  PHP에서 버퍼를 지우는 방법은 무엇입니까?

PHP에서 버퍼를 지우는 방법은 무엇입니까?

青灯夜游
青灯夜游원래의
2020-08-25 11:54:065017검색

php에서 버퍼를 지우는 방법: 1. "ob_clean()" 함수를 사용하여 php 버퍼의 내용을 지웁니다. 2. "ob_end_clean()" 함수를 사용하여 php 버퍼의 내용을 지웁니다. 출력 버퍼를 닫습니다.

PHP에서 버퍼를 지우는 방법은 무엇입니까?

권장: "PHP 비디오 튜토리얼"

php 방법으로 버퍼

방법 1: ob_end_clean

ob_end_clean - 버퍼를 지우고 출력 버퍼를 닫습니다

구문: ​​

ob_end_clean ( void ) : bool

이 함수는 최상위 출력 버퍼의 내용을 버리고 이 버퍼를 닫습니다. 버퍼의 내용을 추가로 처리하려면 ob_end_clean()을 호출하기 전에 ob_get_contents()를 호출해야 합니다. 왜냐하면 ob_end_clean()이 호출되면 버퍼 내용이 삭제되기 때문입니다.

반환 값

성공 시 TRUE를 반환하고, 실패 시 FALSE를 반환합니다. 오류의 첫 번째 이유는 호출 시 활성 버퍼가 없거나 어떤 이유로(아마도 특수 버퍼의 경우) 버퍼를 삭제할 수 없기 때문입니다.

방법 2: ob_clean() 사용

ob_clean - 출력 버퍼 지우기(지우기)

설명

ob_clean ( void ) : void

이 함수는 출력 버퍼의 내용을 삭제하는 데 사용됩니다.

이 함수는 ob_end_clean() 함수처럼 출력 버퍼를 파괴하지 않습니다.

출력 버퍼링은 PHP_OUTPUT_HANDLER_CLEANABLE 플래그를 사용하여 ob_start()에 의해 시작되어야 합니다. 그렇지 않으면 ob_clean()은 아무런 효과가 없습니다.

반환값

반환값이 없습니다.

지식 넓히기

버퍼란 무엇인가요?

간단히 말하면, 버퍼의 기능은 입력 또는 출력 내용을 표시하거나 읽지 않고 먼저 메모리에 넣는 것입니다. 버퍼, 이것은 매우 광범위한 질문입니다. 관심이 있다면 인터넷에서 정보를 찾을 수 있습니다.

사실 버퍼의 가장 중요한 역할은 고속 CPU와 상대적으로 느린 IO 장치(디스크, etc.)

PHP가 실행될 때 버퍼는 어디에 사용되나요?

PHP의 버퍼를 이해하려면 PHP를 실행할 때 버퍼가 어디에 설정되는지 알아야 합니다. PHP를 실행하다가 echo print_r과 같은 데이터를 출력하는 코드를 만나면 PHP는 출력할 데이터를 PHP 자체 버퍼에 넣고 출력을 기다립니다.

PHP 자체 버퍼가 명령을 받으면 해당 명령이 버퍼의 내용을 아파치는 PHP로 출력된 데이터를 받아 아파치 자체 버퍼에 저장하고, 출력이 될 때까지 기다립니다

아파치가 명령에 도달하면 , 버퍼의 내용을 출력하기 위해 버퍼의 내용이 출력되어 브라우저에 반환됩니다.

단계: php---->를 실행합니다(echo, print_r 및 기타 출력이 발생하는 경우). be 데이터가 PHP 자체 버퍼에 배치되어 출력을 기다립니다. ----> (출력 버퍼 내용 수신) 데이터가 아파치로 출력되고, 아파치 자체 버퍼에 저장됩니다. ----> (출력 사양 수신) buffer Area content 출력, 브라우저로 반환됨

echo、print => php output_buffering => webServer buffer => browser buff => browser display

즉: 스크립트 출력 => PHP 버퍼 설정 => 시스템 버퍼 설정(apache, nginx) => 브라우저 버퍼 설정 => 사용자에게 표시

PHP가 데이터를 출력하려고 하면 두 개의 버퍼(첫 번째는 자체 버퍼, 다음은 Apache 버퍼)를 거친 다음 브라우저로 돌아갑니다.

PHP에서 버퍼는 어떤 역할을 합니까?

1. 일반적인 점은 헤더 기능을 사용하기 전에 일부 데이터가 출력되었다는 것입니다. 이로 인해 헤더 정보를 수정할 수 없습니다 – 헤더가 이미 전송되었습니다.

echo "this is test";
header("LOCATION http://www.baidu.com");

이 오류의 원인 예, 일부 데이터가 헤더 기능 이전에 출력되었습니다. 헤더를 입력하고 이 데이터를 출력하는 동안 Apache는 브라우저에 응답 상태를 동시에 보낸 후(출력이 있으므로 요청이 유효함) 다시 시도합니다. 헤더 기능

을 사용하여 http를 보내는 경우 헤더를 사용하면 이 오류가 반환됩니다. 오류는 HTTP 헤더가 전송되었으며 수정할 수 없음을 의미합니다.

왜 버퍼를 사용하면 이 오류를 피할 수 있나요?

헤더 기능은 버퍼의 영향을 받지 않기 때문입니다. 헤더 함수를 발견하면 PHP는 즉시 아파치를 실행하여 이 http 헤더를 브라우저로 보냅니다.

출력 데이터는 PHP가 출력 버퍼를 연 후에 저장됩니다. 이렇게 하면 이전에 발생한 오류를 피할 수 있습니다.

2. PHP를 통해 파일 다운로드 프로그램을 작성할 때 ((예) PHP의 HTTP 중단점 재개 구현 원리)

파일 다운로드를 보다 안전하게 하고 동시에 제어성을 향상시키기 위해 많은 친구들이 좋아합니다. PHP를 사용하여 파일 다운로드 페이지를 작성하는 방법은 매우 간단합니다. 즉, fwrite를 통해 파일 내용을 읽고 표시한 다음 header를 통해 HTTP 헤더를 보내 이것이 첨부 파일임을 브라우저에 알리는 것입니다. 다운로드 효과를 제공합니다.

如果用上面的办法提供下载页面,会碰到一个效率问题,如果一个文件很大,假设为100M,那么在不开启缓冲区输出的情况下,必须要把100M数据全部读出,然后一次返回到页面上,如果这样做,用户将会在所有数据读完之后才会得到响应,降低了用户体验感.

如果开启了输出缓冲区,当PHP程序读完文件的某一段,然后马上输出到apache,然后让apache马上返回到浏览器,这样就可以减少用户等待时间.那后面的数据怎么办呢?我们可以写一个while循环,一直一段一段地读取文件每读一段,就马上输出,直到把文件全部输出为止,这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕. 另外,该做法还解决了另外一个很严重的问题.例如一个文件是100M,如果不开启缓冲区的情况下,则需要把100M文件全部读入内存,然后再输出.但是,如果PHP程序做了内存限制呢?为了保证服务器的稳定,管理员通常会把PHP的执行

内存设一个限制(通过php.ini总的memory_limit, 其默认值是8M), 也就是每个PHP程序使用的内存不能使用超过这个值的内存. 假设该值为8M,而要读入的文件是100M,根本就没有足够的内存来读入该文件.这个时候,我们就需要用到上面的

办法来解决这个问题,每次只读某一段,这样就可以避免了内存的限制

3、静态文件缓存

现在很多公司有这么一个需求, 就是某一个页面在第一次访问的时候,会执行PHP,然后把显示的内容返回到浏览器,同时需要把这次显示的内容保存到服务器上,这样下次访问的时候,就直接把保存在服务器上的文件直接显示,而不需要通过PHP来做操作这就是所谓的”静态页面缓存”.那怎么样才能做到把内容返回到浏览器的同时把数据保存到服务器上呢?这就要用到输出缓冲区了.

ob_start();
echo 'aaa';
$string = ob_get_contents();
file_put_contents('a.html', $string);
ob_flush();
flush();

与输出缓冲区有关的配置

在PHP.INI中,有两个跟缓冲区紧密相关的配置项

1.output_buffering

该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值);

  • on    - 开启缓冲区

  • off    - 关闭缓冲区

256k    - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区(把数据发送到apache);

2.implicit_flush

该配置直接影响apache的缓冲区,有2种配置参数. on/off

  • on - 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等待其他指令,直接就把输出返回到浏览器

  • off - 不自动刷新apache缓冲区,接受到数据后,等待刷新指令

与缓冲区有关的函数

1.ob_implicit_flush

作用和implicit_flush一样,是否自动刷新apache的缓冲区

2.flush

作用是发送指令到apache,让apache刷新自身的输出缓冲区.

3.ob_start

打开输出缓冲区,无论php.ini的文件如何配置,如果使用该函数,即使output_buffering设置成off,也会打开输出缓冲区

ob_start函数还接受一个参数,该参数是一个函数的回调,意思是,在输入缓冲区内容之前,需要使用调用传递进来的参数把缓冲区的内容处理一次,再放入缓冲区内

4.ob_flush

指示php本身刷新自身的缓冲区,把数据发送到apache

5.ob_clean

清除php缓冲区里面的内容

6.ob_end_clean

清除php缓冲区内的内容,并且关闭输出缓冲区

7.ob_end_flush

把php自身的缓冲区里的内容发送到apache,并把清除自身缓冲区内的内容

8.ob_get_clean

获取缓冲区的内容之后,清除缓冲区.

9.ob_get_contents

获取输出缓冲区里的内容

10.ob_get_flush

获取缓冲区里的内容,并且把这些内容发送到apache

11.ob_get_length

获取缓冲区里内容的长度

12.ob_list_handlers

获取运行ob_start时,所回调的函数名称, 例如:

ob_start(‘ob_gzhandler’);

print_r(ob_list_handlers);

将打印出ob_gzhandler;

13.ob_gzhandler

该函数的作用是作为ob_start的回调参数, 在缓冲区刷新之前,会调用该函数对数据进行到底gzip或者deflate压缩.这个函数需要zlib扩展的支持.

위 내용은 PHP에서 버퍼를 지우는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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