php怎么关闭缓冲区

教程操作环境:windows7系统、PHP7.1版,DELL G3电脑

PHP 缓冲区(buffer)

脚本输出信息首先放入buffer,只有当buffer满了或者脚本运行完毕,数据才会往下一阶段转移。在配置文件php.ini可以找到output_buffering设置项,我的默认配置(Windows/XAMPP v3.2.2)是4096

1.png

若设置成On,缓冲区可用且无大小限制;

若设置为Off,缓冲区不可用;

若设置为整数,缓冲区可用且为设置大小,单位字节

需要注意的是,ini_set无法设置buffer大小,在初始化脚本运行环境时,已经做好了buffer的定义;cli模式下始终默认output_buffering为Off。

那么问题来了,缓冲区关闭和打开有什么区别?缓冲区初始设置的大小有什么作用?cli模式默认关闭若业务需要能开启吗?缓存区存在有什么好处?

1. 缓冲区关闭和打开有什么区别?

通过代码检验

output_buffering配置为4096时,运行代码

输出结果:在等待3秒钟后,同时输出了start和end

Output_buffering配置为Off时,运行相同代码

输出结果:先输出了start,等待3秒钟后,输出了end

单一看结果一模一样啊~但是观察其运行过程发现了很惊讶的不同点。若缓冲关闭,先输出“start”,等待3秒后再输出“end”。而缓冲开启,会等待脚本执行完成,一并输出结果

这个例子中,flush用于刷新apache的缓冲区,类似让PHP buffer与浏览器建立直接联系,好让我们的注意力能够专注PHP buffer本身。

通过一个形象的例子比喻,PHP的缓冲区像一个大房子,每次echo等输出函数执行时,将数据扔到这个大房子里,直到脚本执行完成或执行ob_flush函数,将数据从大房子中释放,扔给了WEBServer缓冲区。关闭了PHP缓冲区后,echo函数执行,没有大房子可以放怎么办呢,就只好直接交给WebServer缓冲区了。

通过例子和代码执行结果,我们能够明白,所谓PHP buffer,是PHP本身开辟的数据存储中枢站,一系列的ob函数都是为此操作。(举几个例子函数)

ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。

ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。

ob_get_contents(); //返回缓冲区的内容,不输出

ob_get_length(); //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。

2. 缓冲区初始设置的大小有什么作用?

将output_buffering从4096改为5,方便执行测试

执行代码

输出说明:等待3秒后,输出1234end

执行代码

输出说明:输出12345,等待3秒后,输出end

通过输出的比较,很能说明区别了。

缓冲区只能放5字节的数据,放进来的小于这个最大值,还能先存存放放,要是大于等于临界值,那就只好将数据踢出去了,这就跟我们手动执行了ob_flush函数一个效果。

3. cli模式默认关闭若业务需要能开启吗?

这个问题可以做个补充,非cli模式下,如果php.ini设置缓冲区关闭,但是业务需要用到buffer,咋整呢,难不成还要去改配置。当然不会那么难搞了,这时候又一个ob函数来了,

ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。

知道了PHP buffer类似数据临时存储区的概念,回过头再来看看TP5源码

先看看ob_get_level和ob_get_clean函数解释

ob_get_level() :返回输出缓冲机制的嵌套级别。

ob_get_clean():得到当前缓冲区的内容并删除当前输出缓冲区。

从代码中也能得知一二,若level获取大于0,获取缓冲区的内容并删除缓冲区,再通过ob_start打开一个新的,这也很符合注释里说明的“重新申请”。

这里解释下所谓的嵌套,至于level的值啥时候会为0,并且非0的话是什么呢,请将php.ini output_buffering关闭,输出看看结果。另外多次ob_start,多次ob_get_level,来试试对比输出结果吧。

先来看看两种模型


在多次ob_start打开新的缓冲区时,数据结构的构造为第二种,这就是嵌套了。ob_get_level返回了嵌套的级别。

个人理解,嵌套可以套用Java的流机制来类比,一个缓冲区的数据输出到下一个缓冲区,然后可以对数据做定制化的操作。

现在看TP5源码,思路就比较清晰了。如果系统初始化了缓冲区,因为大小可能会有限制,所以先删除再重新打开。而执行ob_start打开的缓存区,它的大小“足够大”,但是到底有多大,暂时没有查到具体的说明,只知道,不管写入数据多大,都会直到脚本结束才会发送

4. 缓存区存在有什么好处?

PHP输出数据发送到WebServer,若echo执行一次发送一次,这加大了资源消耗,不如存储在内存中,统一发送更有效率。

Web请求包含Http头部,头部在设置之前不能有任何的输出。PHP缓冲区替我们做好了这步工作,在头部发送前输出各种数据,缓冲区会先将头部信息发送到WebSever,再统一发送数据报文。

--结束END--

本文标题: php怎么关闭缓冲区

本文链接: https://www.lsjlt.com/news/217.html (转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢

  • php怎么关闭缓冲区

    php关闭缓冲区的方法:1、打开PHP安装目录,找到并打开配置文件“php.ini”;2、在配置文件中,找到“output_buffering”项,将该项的值设置为“Off”即可。
    阅读数:329 php 缓冲区
  • php怎么设置时区为西六区

    在PHP中,可以利用“date_default_timezone_set()”函数设置时区为西六区,该函数用于设置脚本中所有日期时间函数使用的默认时区,语法为“date_default_timezone_set("Etc/GMT-6")”。
    阅读数:144 PHP
  • php关闭文件怎么操作

    在php中,可以使用fclose()函数来执行关闭文件的操作,该函数可以关闭一个已打开的文件指针,语法“fclose($handle)”;如何关闭成功则返回TRUE,失败则返回FALSE。
    阅读数:802 php 关闭文件
  • php怎么关闭自动转义

    php关闭自动转义的方法:1、找到并打开php.ini文件;2、将“magic_quotes_gpc”和“magic_quotes_runtime”设置为“Off”即可。
    阅读数:362 php
  • php怎么关闭ob_start

    php ob_start用于打开输出控制缓冲,其实现关闭ob_start则可以使用ob_end_clean()函数静默丢弃掉缓冲区的内容。
    阅读数:722 php ob_start
  • php怎么关闭结果集

    php关闭结果集的方法:1、通过“mysql_free_result($b);”回收结果集;2、使用“mysql_close($con);”关闭数据库连接即可。
    阅读数:863 php 结果集
  • php怎么关闭magic_quotes_gpc

    php关闭magic_quotes_gpc的方法:1、将php.ini的“magic_quotes_gpc”设置为Off;2、在“.htaccess”里写入“php_value magic_quotes_gpc Off”。
    阅读数:503 php magic_quotes_gpc
  • ubuntu php 关闭警告怎么办

    ubuntu php关闭警告的解决办法:1、打开php配置文件php.ini;2、把“display_errors=Off”改为“display_errors=On”;3、修改Apache的httpd.conf;4、重启Apache。
    阅读数:327 ubuntu php
  • PHP怎样关闭文件

    这篇文章主要介绍了PHP怎样关闭文件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PHP 关闭文件 - fclose()fclose() 函数用于关闭打开的文件。注释:用完文
    阅读数:254 php
  • 怎么用php打开文件和关闭文件

    在php中,可以使用fopen()函数来打开文件,语法“fopen(filename,mode,path,context)”;可以使用fclose()函数来关闭文件,该函数可以关闭一个打开文件,语法“fclose(file)”。
    阅读数:156 php 打开文件 关闭文件
  • 详细分析PHP7与PHP5区别

    这篇文章主要介绍了详细分析PHP7与PHP5区别,一步步通过问题和代码实例去进行描述两个版本的区别,需要的朋友可以参考下
  • php如何截取数组的某一区间

    在php中使用array_slice()函数截取数组中的某一区间,具体方法如下:array_slice()函数作用:php中array_slice()函数的作用是用于根据条件取出数组中的一段值,并返回。array_slice()函数语法:a
    阅读数:132 PHP
  • PHP平滑关闭/重启的实现方法

    "平滑重启"和"快速重启"是两种不同的概念,下面这篇文章主要给大家介绍了关于PHP平滑关闭/重启的实现方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
  • 如何解决nginx php-cgi 自动关闭问题

    nginx php-cgi自动关闭的解决办法:1、下载nssm;2、将其解压出来,进入nssm.exe所在的位置;3、执行“nssm install”并设置路径及参数;4、开启服务即可。
    阅读数:400 nginx php-cgi
  • PHP中php://input怎么用

    php://input可以读取没有处理过的POST数据,其使用方法如“$xmldata = file_get_contents("php://input");”,用于接收xml数据。
    阅读数:735 PHP 输入流
  • php ufeff怎么去掉

    php去掉ufeff的方法:1、将PHP文件保存为无dom格式;2、通过“function checkBOM($filename){...}”方法检查并去掉ufeff即可。
    阅读数:120 php ufeff
  • php怎么实现telnet

    php实现telnet的方法:1、创建一个PHP示例文件;2、通过“class PHPTelnet {function Connect($server,$user,$pass) {...}}”方式实现telnet功能即可。
    阅读数:240 php telnet
  • php怎么删除目录

    php删除目录的方法:1、创建一个PHP示例文件;2、找到需要删除的目录;3、使用rmdir()函数删除指定的目录即可。
    阅读数:364 php 目录
  • php怎么增加函数

    php增加函数的方法:1、创建一个PHP示例文件;2、通过“function functionName(){...}”方式创建函数即可。
    阅读数:620 php 函数
  • php 怎么设置空格

    php设置空格的方法:1、创建一个PHP示例文件;2、通过“function white_space( $string, $whitespace ){...}”方法设置空格即可。
    阅读数:113 php 空格