五、大存储的解决方案:
最终目标:不查询数据库或少查询数据库,在查询数据库时,要快速的查询到数据。
1、使用服务器端的缓存。
(1)磁盘缓存(页面静态化技术)
(2)内存缓存
内存缓存技术:
memcache,redis,mysql的memory存储引擎
2、优化数据库
六、页面静态化技术
把一个动态(操作数据库)的php页面,转换成一个静态的.html页面
实现步骤;
一个http请求,返回的数据分两部分,响应头部信息和响应主体。
(1)拿到响应主体数据内容。(ob缓存)
(2)把响应主体数据内容,写入到html文件中,(file_put_contents)
(3)直接访问html文件。
1、ob缓存内容:
ob缓存:output_buffering(输出缓存),用于缓存响应主体的数据内容。
如何开启:
第一种方式:在php.ini文件中,
第二种方式:在页面中使用ob_start()函数,来开启。
两种方式的区别是,ob_start()只在当前页面有效,
2、通过学习几个函数,加深ob缓存理解。
在请求一个php的过程中,我们实际上经过三个缓存,ob缓存(如果开启),程序缓存(默认开启,我们无法关闭),浏览器缓存(客户端)。
ob_get_contetns();获取ob缓存里面的数据内容。
ob_clean();//清空ob缓存里面的数据,不关闭ob缓存。
ob_end_clean();//清空ob缓存里面的数据,并关闭ob缓存。
ob_flush();//把ob缓存里面的数据给刷新(移动,推送)到程序缓存,但不关闭ob缓存,不缓存,但输出。
ob_end_flush();//把ob缓存里面的数据给刷新(移动,推送)到程序缓存,并关闭ob缓存。
注意:ob缓存可以嵌套,可以开启多个,在逻辑上理解成文件夹的嵌套,在操作时,是操作当前开启的ob缓存。
可以使用ob_get_level();获取开启的ob缓存的层级。
flush()函数;
在面试时会 问到。flush()和ob_flush()的区别、
flush()把程序缓存里面的数据给刷新到浏览器。
一些版本的浏览器只有当接受到256个字节后才开始显示,该页面,所以必须发送一些额外的空格来让这些浏览器显示页面的内容。程序开头可加echo str_repeat(“”,1024);
3、使用ob缓存来完成一个案例:
ob_start();//开启ob缓存
当前案例的缺点是:当数据库里面的数据内容更改了,则还是读取的静态页面的内容,实时性不高,应该设置一个缓存周期,比如缓存5分钟,则5分钟之后,重新生成静态页面。
假如一个网站的并发量是500,5分钟则请求数据库多少次,500*60*5=150000
如果缓存5分钟,则请求数据库多少次?答案是:1次。
如何判断是否过有效期呢?比如有效期是300秒,
如果是新闻列表则:
添加一个连接:
在showintro.php页面中:
关键是给生成的静态页面命名。
扩展:
网站静态化:从形式上来分:
真静态:实实在在的生成一个html页面。
伪静态:从表面上看是访问的一个静态页面,实际上还是访问的是动态页面。比如如下地址:
http://www.abc.com/news-music-id12.html
实际上是访问:http://www.abc.com/news.php?type=music&id=12页面。
伪静态主要是利于seo的。
实现方式:
真静态实现方式:
第一种:使用ob缓存技术。
第二种:使用模板替换技术
伪静态的实现方式:使用apache的 rewrite机制(url重写机制)
哪些网站适合于真静态?
网站页面访问比较频繁的,更新不是很频繁,比如一些新闻类型的网站,不适合于要求实时更新的一些网站,比如股票类型的网站,
相关函数列表:
· ob_start : 打开输出缓冲区,当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。
获取缓冲区信息
· ob_get_contents : 返回内部缓冲区的内容。
· ob_get_clean : 返回内部缓冲区的内容,并关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()
· ob_get_flush :返回内部缓冲区的内容,并关闭缓冲区,再释放内部缓冲区的内容。相当于ob_end_flush()并返回内部缓冲区内容
· —————
· ob_get_length :返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
· ob_get_level: Return the nesting level of the output buffering mechanism
· ob_get_status: Get status of output buffers
关闭/删除/刷新缓冲
· ob_clean :删除内部缓冲区的内容,但不关闭缓冲区,也就说该语句之后的输出内容将会继续被添加至缓冲区。
· ob_flush :释放内部缓冲区的内容,并删除内部缓冲区的内容,但不关闭缓冲区。
· flush: 将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器。
· ————
· ob_end_clean :删除内部缓冲区的内容,并关闭缓冲区。
· ob_end_flush :释放内部缓冲区的内容,并关闭缓冲区。
其它
· ob_gzhandler: ob_start 回调函数,用gzip压缩缓冲区的内容。
· ob_implicit_flush: 打开或关闭绝对刷新,默认为关闭(但受implicit_flush选项的制约)。所谓绝对刷新,即当有输出语句(e.g. echo)被执行时,便把输出直接发送到浏览器,而不再需要调用 flush()或等到脚本结束时才输出。
· ob_list_handlers :List all output handlers in use
· output_add_rewrite_var: Add URL rewriter values
· output_reset_rewrite_vars — Reset URL rewriter values
这些函数的行为受php_ini设置的影响:
· output_buffering :该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。
· output_handler: 该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
· implicit_flush:作用同ob_implicit_flush,默认为Off。
注意事项:
· 一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为 了确保flush有效,最好在ob_flush()函数前有以下语句:
print str_repeat(“ ”, 4096); //以确保到达output_buffering值。
· ob_* 系列函数是操作PHP本身的输出缓冲区,所以,ob_flush只刷新PHP自身的缓冲区。而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。
· 不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。
· 要先ob_start()再 flash否则报错