php是现在的web三大开发语言之一,在国外的php和Linux以及Apache,MySQL占有相当大的市场份额,我今天来给大家讲一下php中缓存的技术。
服务器的架构我们都知道,前段是负载均衡器,然后把来自浏览器的响应请求按照服务器的Apache负载当前能力分配给后台的Apache服务器,Apache按照文件是HTML静态页或者php等脚本语言执行与否,再返回给浏览器端。
但是由于由于数据以及访问量的增多,现在在Apache服务器进行着一种缓存,以提高服务器响应速度。php有两种这样子的缓存,一种是ob缓存,一种是程序缓存。
程序缓存是php脚本在服务器端运行的时候每一行的输出结果的字符串先放在内存的一个地方,在php脚本执行完毕的时候,把这些输出的结果全部返回给浏览器端。
比如这样子的一个php脚本
<?php
header("content-type: text/html;charset=utf-8");
echo 'hehe';
?>
这样的一个脚本运行的结果就是hehe,他是先把两行代码先缓存到程序缓存中间,然后把程序缓存一次性发给浏览器端。
ob缓存是把服务器执行php脚本时候所打印(echo)出的字符先缓存在内存中,然后在php脚本执行完毕的时候把这些字符串一次性全部发给浏览器端。记住,仅仅是echo(打印)出来的字符串能够缓存到ob缓存中。
注意:ob缓存在php5.2默认是不打开的,需要在php.ini文件中做配置,在php.ini文件中修改output_buffering=4096这一行前边的分号去掉,后边的数值是自己设置缓存最大的容量,一般设置为4096就差不多了。
首先介绍几个函数:
ob_start()函数:开启ob缓存,记住只有在你的php.ini文件中做过配置才可以使这个函数生效的哦。如果没有这一行代码的话,ob缓存是不会开启的,等于说你是存不到ob缓存中去的。
ob_get_contents()函数:把ob缓存中的所有数据全部返回,返回值就是ob缓存中现有的所有的数据,原来的缓存数据还在。
ob_clean()函数:把存在ob缓存中的所有字符串全部清空,就等于说原来存在ob缓存中的数据就全部不存在了。
ob_end_clean()函数:顾名思义,把ob缓存中的数据先清空,然后关闭ob缓存。
ob_flush() 函数:把ob缓存中的所有数据全部取出来然后交给程序缓存,ob缓存就会变成空的。
ob_end_flush() 函数:把ob缓存中的所有数据全部取出来然后交给程序缓存,ob缓存就会变成空的。,然后再关闭ob缓存。
flush()函数:这个php面试中经常会遇到,flush函数是把程序缓存一次性全部输出给浏览器端,记住,是程序缓存而不是ob缓存。例如下边这个php脚本
ob_start();
echo '1';
ob_clean();
?>
结果是浏览器什么也得不到,因为开启了ob缓存以后,输出的1就全部在ob缓存中了,flush函数把程序缓存里边的所有的数据传给浏览器端,但是此时程序缓存是空的,因为数据都在ob缓存之中,所以浏览器自然是什么都得不到。但是如果换一下例如:
<?php
echo '1';
ob_start();
flush();ob_clean();
?>
这样子的话先输出了1在程序缓存之中,然后开启了ob缓存,flush函数把程序缓存的数据传给浏览器端,所以此时程序缓存的数据1就传输给了浏览器端,所以ob_clean()函数也没什么作用。所以浏览器端得到的数据就是1。
最后做一个总结:事实上现在的每一个软件都有缓存,包括浏览器也有缓存,你传输过去的字符串只有积累到1024字节浏览器才会输出显示(ie版本是这样,其他的我没试过),当然这也是为了执行效率着想。php程序运行时有两个缓存机制ob缓存和程序缓存,通过程序的代码机制使用这两个缓存把php文件执行过后发给浏览器端,然后浏览器存入自身缓存,当达到一个量的时候就一次性全部输出。
这就是我对于php缓存的一些了解,有什么疑问或者我的错误欢迎大家发信给我,谢谢观看啦~~~~