广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php怎么关闭缓冲区
  • 329
分享到

php怎么关闭缓冲区

php缓冲区 2016-02-10 01:02:26 329人浏览 绘本
摘要

本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑PHP 缓冲区(buffer)脚本输出信息首先放入buffer,只有当buffer满了或者脚本运行完毕,数据才会往下一阶段转移。在配置文件php.ini可以找到outp

教程操作环境: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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php怎么关闭缓冲区
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑PHP 缓冲区(buffer)脚本输出信息首先放入buffer,只有当buffer满了或者脚本运行完毕,数据才会往下一阶段转移。在配置文件php.ini可以找到outp...
    99+
    2016-02-10
    php 缓冲区
  • php如何关闭缓冲区?两种常用方法分享
    在PHP中,缓冲区是将输出内容暂时储存在内存中,当PHP脚本全部执行完毕后再一并输出到浏览器端。这种输出方式在某些时候会产生一些不可控的问题,比如当页面需要动态输出一定量的数据内容时,缓冲区过大会导致页面响应缓慢,甚至出现服务器崩溃的情况。...
    99+
    2023-05-14
    缓冲区 php
  • Oracle中字符缓冲区相关错误
    一、buffer overflow,limit of 10000 bytesdeclarebeginfor c in 1..1000 loop dbms_output.put_line('测试测试测试'...
    99+
    2022-10-18
  • Java NIO直接缓冲区和非直接缓冲区是什么
    这篇文章主要讲解了“Java NIO直接缓冲区和非直接缓冲区是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO直接缓冲区和非直接缓冲区是什么”吧!定义j...
    99+
    2023-06-21
  • c++怎么清空输入缓冲区
    在C++中,你可以使用cin.ignore()来清空输入缓冲区。它会忽略掉缓冲区中剩余的所有字符,直到换行符为止。以下是一个示例代码...
    99+
    2023-10-23
    c++
  • Redis缓冲区溢出怎么解决
    这篇文章主要介绍“Redis缓冲区溢出怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis缓冲区溢出怎么解决”文章能帮助大家解决问题。缓冲区(buffer),是内存空间的一部分。也就是说...
    99+
    2023-07-06
  • php缓存如何关闭
    这篇文章主要介绍“php缓存如何关闭”,在日常操作中,相信很多人在php缓存如何关闭问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php缓存如何关闭”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!关闭php...
    99+
    2023-06-20
  • mongodb缓冲区间不足怎么解决
    当MongoDB缓冲区间不足时,可以尝试以下方法来解决问题:1. 增大MongoDB的缓冲区间:可以通过修改MongoDB的配置文件...
    99+
    2023-08-24
    mongodb
  • python中什么是缓冲区
    这篇文章将为大家详细讲解有关python中什么是缓冲区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyt...
    99+
    2023-06-14
  • C++怎么实现print缓冲区的刷新
    这篇文章主要讲解了“C++怎么实现print缓冲区的刷新”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现print缓冲区的刷新”吧!printf缓冲区问题以下内容在Linux测试...
    99+
    2023-06-30
  • win10缓冲区溢出问题怎么解决
    Win10缓冲区溢出问题可以通过以下几种方法来解决:1. 更新操作系统:缓冲区溢出问题通常是由于操作系统中的漏洞引起的。因此,更新操...
    99+
    2023-06-10
    缓冲区溢出
  • php怎么关闭magic_quotes_gpc
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php怎么关闭magic_quotes_gpc?PHP6、PHP7关闭magic_quotes_gpc对程序的影响在PHP5及之前,magic_quotes_gpc默认是...
    99+
    2018-12-03
    php magic_quotes_gpc
  • php怎么关闭ob_start
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php怎么关闭ob_start?ob_start — 打开输出控制缓冲说明ob_start(callable $output_callback = null, int $...
    99+
    2018-06-27
    php ob_start
  • Java NIO中Buffer缓冲区有什么用
    这篇文章主要介绍Java NIO中Buffer缓冲区有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、Buffer 简介Java NIO 中的 Buffer 用于和 NIO 通道进行交互。数据是通道...
    99+
    2023-06-29
  • win11基于堆栈的缓冲区溢出怎么解决
    基于堆栈的缓冲区溢出是一种常见的安全漏洞,攻击者通过向程序输入超过预留内存空间的数据,覆盖了程序的堆栈空间,从而控制程序的执行流程,...
    99+
    2023-10-26
    win11
  • php怎么关闭结果集
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑php怎么关闭结果集用mysql_free_result($b); 回收结果集;用mysql_close($con);关闭数据库连接;mysql_free_result(...
    99+
    2018-06-13
    php 结果集
  • C++缓冲区刷新的方法是什么
    在C++中,可以使用以下方法刷新缓冲区: 使用std::endl:在输出流中使用std::endl会自动刷新缓冲区,并插入一个换行...
    99+
    2023-10-23
    C++
  • Win10怎么关闭图片缩略图缓存
    本文小编为大家详细介绍“Win10怎么关闭图片缩略图缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“Win10怎么关闭图片缩略图缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、利用快捷键win+r打开运...
    99+
    2023-06-28
  • 怎么关闭PHP短信验证
    这篇“怎么关闭PHP短信验证”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么关闭PHP短信验证”文章吧。关闭短信验证步骤如...
    99+
    2023-07-05
  • ubuntu php 关闭警告怎么办
    本文操作环境:Ubuntu 14.04系统、PHP5版、DELL G3电脑ubuntu php 关闭警告怎么办Ubuntu 14.04中,默认的PHP开发环境配置是不提示所有的警告、错误信息的。这对于开发者来说是很痛苦的。在此记录下配置方法...
    99+
    2017-02-18
    ubuntu php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作