Jtti广告广告
返回顶部
首页 > 资讯 > 后端开发 > 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

猜你喜欢
  • 浅析Java NIO 直接缓冲区和非直接缓冲区
    定义 以上是书《深入理解java虚拟机》对直接内存的描述。直接缓冲区用的就是直接内存。 java nio字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则j...
    273
    2023-09-27
    Java NIO 直接缓冲区 Java NIO 非直接缓冲区
  • 【Linux】文件缓冲区
    目录 一、缓冲区图解二、自定义实现文件操作函数三、强制刷新内核缓冲区(fsync) 提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍...
    542
    2023-09-27
    linux 网络
  • Java NIO直接缓冲区和非直接缓冲区是什么
    这篇文章主要讲解了“Java NIO直接缓冲区和非直接缓冲区是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO直接缓冲区和非直接缓冲区是什么”吧!定义j...
    496
    2023-09-27
  • php如何关闭缓冲区?两种常用方法分享
    在PHP中,缓冲区是将输出内容暂时储存在内存中,当PHP脚本全部执行完毕后再一并输出到浏览器端。这种输出方式在某些时候会产生一些不可控的问题,比如当页面需要动态输出一定量的数据内容时,缓冲区过大会导致页面响应缓慢,甚至出现服务器崩溃的情况。...
    460
    2023-09-27
    缓冲区 php
  • Redis缓冲区溢出怎么解决
    这篇文章主要介绍“Redis缓冲区溢出怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis缓冲区溢出怎么解决”文章能帮助大家解决问题。缓冲区(buffer),是内存空间的一部分。也就是说...
    590
    2023-09-27
  • 浅谈Redis缓冲区机制
    目录Redis缓冲区机制客户端缓冲机制应对输入缓冲区溢出查看输入缓冲区信息如何解决输入缓冲区溢出应对输出缓冲区溢出Monitor命令的执行输出缓冲区设置不合理主从集群中的缓冲区复制缓...
    490
    2023-09-27
    Redis缓冲区
  • Java Buffer缓冲区(NIO)
    目录Java NIO(Buffer)1.1 Buffer 简介1.2 Buffer 的基本用法1、使用 Buffer 读写数据,一般遵循以下四个步骤:2、使用 ByteBuffer的...
    688
    2023-09-27
    Java JavaNIO
  • Linux 命令 管道 缓冲区
    这是王工的一个问题.MySQL监控指标.使用 mysqladmin 每秒间隔获取信息, 将信息格式化后输出文件.获取信息和格式化的命令   mysqladmin -uroot -proot&...
    632
    2023-09-27
  • Node.js Buffer(缓冲区)
    Node.js Buffer(缓冲区)JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放...
    683
    2023-09-27
  • Redis缓冲区机制实例分析
    这篇文章主要介绍“Redis缓冲区机制实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis缓冲区机制实例分析”文章能帮助大家解决问题。Redis缓冲区机制Redis中的缓冲区机制就是为了...
    440
    2023-09-27
  • 缓冲区溢出之LINUX实例
    缓冲区溢出是一种常见的安全漏洞,当输入数据超过了程序分配的缓冲区大小时,多余的数据会溢出到相邻的内存区域,导致程序崩溃或者被攻击者利...
    381
    2023-09-27
    LINUX
  • Java NIO 中Buffer 缓冲区解析
    目录一、Buffer 简介二、Buffer 的基本方法1、使用 Buffer 读写数据2、使用 Buffer 的例子三、Buffer 的 capactity、posittion 和l...
    708
    2023-09-27
    Java NIO Buffer 缓冲区
  • python中什么是缓冲区
    这篇文章将为大家详细讲解有关python中什么是缓冲区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyt...
    621
    2023-09-27
  • 【Linux】基础IO —— 缓冲区深度剖析
    🌈欢迎来到Linux专栏~~基础IO ...
    940
    2023-09-27
    linux unix 服务器
  • C++怎么实现print缓冲区的刷新
    这篇文章主要讲解了“C++怎么实现print缓冲区的刷新”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么实现print缓冲区的刷新”吧!printf缓冲区问题以下内容在Linux测试...
    834
    2023-09-27
  • 详解C语言之缓冲区溢出
    目录一、缓冲区溢出原理二、缓冲区溢出实例三、缓冲区溢出防范3.1、gets3.2、strcpy3.3、 strncpy/strncat3.4、sprintf3.5、scanf3.6、...
    904
    2023-09-27
    c 缓冲区溢出
  • 浅谈C++ 缓冲区(buffer)的使用
    缓冲区 缓冲区 (buffer) 是内存空间的一部分. 在内存中会为每一个数据流开辟一个内存缓冲区. 缓冲区是用来存放流中的数据, 缓冲区中的数据就是流. 在 C++ 中, 输入输出...
    351
    2023-09-27
    C++ 缓冲区
  • 探究Java中Integer缓冲区底层原理
    目录一. Integer底层原理探究1. int和Integer的区别2. 被final修饰的Integer类3. IntegerCache缓冲区4. 几个核心实验4.1 比较new...
    208
    2023-09-27
    Java Integer缓冲区底层原理 Java Integer缓冲区 Integer缓冲区 Java Integer
  • Java中的Netty缓冲区的用法
    这篇文章主要介绍“Java中的Netty缓冲区的用法”,在日常操作中,相信很多人在Java中的Netty缓冲区的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的Netty缓冲区的用法”的疑惑有所...
    190
    2023-09-27
  • win10缓冲区溢出问题怎么解决
    Win10缓冲区溢出问题可以通过以下几种方法来解决:1. 更新操作系统:缓冲区溢出问题通常是由于操作系统中的漏洞引起的。因此,更新操...
    261
    2023-09-27
    缓冲区溢出
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作