在使用discuz的时候,我们通常都需要使用discuz中的程序进行安装。
但是在安装的过程中,有一个有趣的现象,就是结果会实时刷新,效果如同是有使用轮询一样,但是轮询一般都是对数据库方面的操作,但是discuz又不是:
通过查看代码,可以发现这个页面的内容是慢慢返回的:
这样子,显然就不是长轮询实现了,而是使用缓存输出了。
看下discuz安装程序代码,果然发现了如下的代码片段:
php缓存区:
当使用php的echo的时候,php并不会立即将字符串送到浏览器(如果这样的话,ttl会非常长,UX相当差)。
在php中的实现是,echo的时候,先放入到php建立的缓冲区中,当缓存区达到一个值的话,php就会将缓冲区的内容送到tcp缓冲区,tcp缓冲区达到一个值后,系统就将tcp缓冲区的内容送到浏览器(后面这段不归php管,前面的php缓冲区才是)。
这个缓冲区的大小是多少呢?在php.ini中可以看到
output_buffering = 4096
调用顺序更好为:ob_flush之后flush
ob_*系列函数, 是操作PHP本身的输出缓冲区.
所以, ob_flush是刷新PHP自身的缓冲区.
而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.
在使用页面静态化技术中,通过也是使用缓冲区技术的。