1.磁盘缓存(DiskCache)操作系统使用磁盘缓存技术提高磁盘的I/O速度,访问缓存副本比访问原始数据更有效率。例如,运行进程的指令同时存储在磁盘和物理内存中,并复制到CPU的L2和L1缓存中。但磁盘缓存技术不同于通常意义上介于CPU和内存之间的小容量高速内存,而是指利用内存中的存储空间,将信息暂时存储在一系列磁盘块读取中从磁盘。因此,磁盘缓存在逻辑上是一个磁盘,在物理上是一个驻留在内存中的磁盘块。缓存在内存中分为两种形式:一种是在内存中单独开辟一块存储空间,作为固定大小的磁缓存;另一种是将未使用的内存空间作为缓冲池,用于系统和磁盘I/O期间共享的请求分页。2.缓冲区(Buffer)高速设备(如CPU)和低速设备(如磁盘)之间的通信必须经过缓冲区,高速设备永远不会直接访问低速设备。所以缓冲区是计算机中临时存储输出或输入信息的内存区域。缓解高速部分与低速部分通信速度不匹配的矛盾。3、PHP输出缓冲区顾名思义,输出缓冲区就是临时存放输出信息的内存区域。输出缓冲区由ob_*系列函数控制。只有在PHP脚本执行结束(自动调用ob_flush())或强制刷新缓冲区(手动调用ob_fush())后,数据才会发送到Nginxfastcgi客户端。当然PHP还有其他的缓冲区,比如字符串缓冲区finfo::buffer。PHP的输出缓冲区默认启用,大小为4096字节。开启后,对所有php页面生效。另一种在页面中单独打开缓冲区的方法是ob_start()函数。//ob_start()有三个参数。$chunk_size用于设置缓冲区大小,可设置范围为0到4096。默认为0,表示大小无限制。boolob_start([callback$output_callback[,int$chunk_size[,bool$erase]]])注意:一个ob_start()是一个新的buffer,buffer是相互叠加的。4.NginxbufferNginx默认不会实时返回php-fpm响应数据给客户端,而是暂时存放在Nginxbuffer中。直到执行php脚本(自动调用flush())或强制刷新(手动flush())缓冲区后,数据才会发送到客户端。5.浏览器缓冲区默认情况下,浏览器默认不会实时显示Nginx返回的数据,而是将接收到的数据暂时存放在浏览器缓冲区中,当缓冲区满时才开始显示。不同的浏览器有不同的缓冲区大小。实际测试发现Mac下的chrome和safari都需要输出1024字节。没有找到刷新缓冲区的方法,可以通过发送额外的空间来解决。或者通过curl请求,通过--no-buffer禁用curl缓冲区。curl'niliu.me'--no_bufferexample实时输出//ob_get_level()返回多少个buffer(因为buffer是叠加的,所以也可以叫多级buffer)var_dump(ob_get_level());//out:1,Level1bufferif(ob_get_level()==0){//如果没有buffer,则新开一个PHPbuffer//默认会有一个buffer,默认的buffer其实很小,所以不需要str_pad来填充ob_start();}for($i=0;$i<10;$i++){echo"Linetoshow.";//nginxfastcgibuffersizeis4K,needtosendExtra4Kspaces;//echostr_pad('',4096)."\n";//将php缓存刷新到Apache/nginxob_flush();//从Apache/nginx刷新到浏览器flush();//这个,浏览器应该显示它,如果浏览器没有立即显示它,用空格填充浏览器缓冲区//echostr_repeat("",1024);睡眠(2);}回声“完成。”;ob_end_flush();//清除(发送)输出缓冲区的内容并关闭缓冲区var_dump(ob_get_level());//out:0,无缓冲区模板渲染类Template{/***渲染方法**@accesspublic*@paramobj信息类*@paramstring模板文件名*/publicfunctionrender($context,$tpl){$closure=function($tpl){ob_start();包括$tpl;返回ob_end_flush();};//PHP7:$closure->call($context,$tpl);$closure=$closure->bindTo($context,$context);$闭包($tpl);}}静态页面生成//打开缓冲区ob_start();//业务逻辑省略//.....$this->assign('模板中的变量赋值');$tpl->display('default_1.tpl');//解析变量后得到模板buffer$html=ob_get_contents();//清除并关闭缓冲区ob_end_clean();//将html写入文件//省略业务逻辑...
