zoukankan      html  css  js  c++  java
  • 105.输出控制缓存

    <?

    php for ($i = 0; $i < 5; $i++) { echo $i; ob_flush(); //怎样开启缓存的话,要加这句话 flush(); sleep(1); }

    有了解过PHP缓存输出控制函数的朋友肯定对上面这段代码非常熟悉,它想实现的效果是每一个1秒输出1个数字,完毕全部输出须要10秒,只是实际运行中你会发现奇怪的现象,有些人或者有些时候它的表现如你所愿。而有些人或者有些时候却是10秒后才会一次性输出10个数字。我以前为此抓狂不已。有朋友留言说这个情况往往是由于IE的缓存必须达到256个字符才会输出。可实际上我之前也考虑到IE的情况,可依然会有时灵时不灵的情况。今天细致读过手冊才明白,这些不可预料的现象是有它的理由的。

    原来php.ini中有两个关键參数会影响到php的缓存输出控制:
    參数1:output_buffering :on/off 或者整数。设置为on时,将在全部脚本中使用输出缓存控制。
    不限制缓存的大小。

    而设置为整数时。如output_buffering=4096。当缓存数据达到4096字节时会自己主动输出刷新缓存。 而这个參数的不同正是导致以上代码在不同一时候候运行结果不同的原因。当output_buffering关闭时,脚本全部的输出(echo) 都会即时发送到client,运行上面代码时就是每秒输出一个数字。

    而开启output_buffering后,输出内容就会先缓存在服务端, 直到脚本结束时才一起发送给client。

    ob_start()
    

    这里写图片描写叙述

    第一个參数:回调函数。可选。在缓存输出前能够对其进行过滤或其它处理。最常见的使用方法是ob_start(‘ob_gzhandler’),即对缓存的数据进行gzip压缩后再发送给client。
    第二个參数:缓存块的大小,可选。

    假设被缓存的内容达到或操作缓存块的大小,缓存会自己主动输出。默认值是0,指不限定大小,缓存到结束为止。还有个特殊值1,代表chunk_size=4096。 第三个參数:是否擦除缓存。可选,默认是true,假设设置为false,则在脚本运行结束前。缓存都不会被清除。

    能够使用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,它们各自制定了一个回调函数各自是functionAfunctionB,那么在缓存B中的数据输出时,它会先辈funcitonB回调函数处理,再交给外层的functionA回调函数处理。之后才干输出到client。 另外。手冊说,对于某些webserver,比方apache,在使用回调函数有可能会改变程序当前的工作文件夹。解决方法是在回调函数中自行手动把工作文件夹改动回来。用chdir函数,这点似乎不常遇到,遇到的时候记得去查手冊吧。

    flush()ob_flush()
    这两个函数的使用怕是非常多人最迷惑的一个问题,手冊上对两个函数的解释也语焉不详。没有明白的
    指出它们的差别。似乎二者的功能都是刷新输出缓存。
    但在我们文章一開始的代码中假设讲fush()替换成ob_flush(),
    程序就再不能正确运行了。显然,它们是有差别的。
    否则也手冊中直接说明当中一个是另外一个函数的别名就可以了,
    不是必需分别说明。那么它们的差别究竟是什么呢?
    重复研究了手冊的说明,參考了手冊中一些人的留言,
    自己琢磨应该是这种:
    在没有开启缓存时,脚本输出的内容都在server端处于等待输出的状态,flush()能够将等待输出的内容马上发送到client。

    开启缓存后。脚本输出的内容存入了输出缓存中, 这时没有处于等待输出状态的内容,你直接使用flush()不会向client发出不论什么内容。而ob_flush()的作用就是将本来存在输 出缓存中的内容取出来,设置为等待输出状态, 但不会直接发送到client。这时你就须要先使用ob_flush()再使用flush(),client才干马上获得脚本的输出。

    也就是说本文开头的脚本,能够依据缓存开启与否, 有例如以下几种不同的写法: 注:下面代码都未考虑IE缓存必须大于256字节才输出的问题。如在IE下測试。请在代码開始加一句:“echo str_repeat(‘ ‘,256)

    这里写图片描写叙述
    这里写图片描写叙述

    也就是说,ob_flush()将 ob 缓存输入到程序缓存,flush()将程序缓存输出到浏览器缓存。

    这里写图片描写叙述


    Output Control 函数具体解释
    这里写图片描写叙述
    这里写图片描写叙述
    这里写图片描写叙述

    http://www.admin10000.com/document/1100.html

  • 相关阅读:
    20200116
    20200115
    20191214数组之四:数字不相同的完全平方数(关于数位上数字判断与sprintf)
    结构体与C++sort()函数的用法
    字符串常用函数
    sscanf用法
    螺旋矩阵
    模m的k次根
    梅森素数与完全数
    bit_reverse_swap
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7267999.html
Copyright © 2011-2022 走看看