仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1526|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页设计缓存手艺详谈和代码完成

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我是根据自己的成长历程来写的,如有不对的还请指正。缓存   ccdot /2006-2-26 3:50:32 /324/
/*
Author: 老农
Last modify:2006-2-26
Author URL:http://www.cjjer.com
Des cription:本篇关于缓存,出蓝色幻想他站回绝转载,不然QXDD.,在php5下经由过程.
*/



一: 引论
PHP,一门比来几年衰亡的web设计剧本言语,因为它的壮大和可伸缩性,近几年来失掉长足的开展,php比拟传统的asp网站,在速度上有相对的优势,想mssql转6万条数据php如需求40秒,asp不下2分钟.然而,因为网站的数据愈来愈多,咱们渴求能更疾速的挪用数据,不用要每次都从数据库失落,咱们可以从其他的中央,例如一个文件,或某个内存地址,这就是php的缓存手艺,也就是Cache手艺.
二: 剖析深切
普通来讲,缓存的目标是把数据放在一个中央让会见的更快点,毫无疑问,内存是最快的,然而,几百M的数据能往内寄存么?这不实际,固然,有的时分一时放如办事器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,晓得等页面输入主动清晰或守候ob_get_contents的前往,[或被ob_end_clean显示的排除,这在静态页面的生成中能很好的使用,在模板中能失掉很好的表现,我的这篇文章深切的会商了:
谈PHP生成静态页面,这是一种体例,但这是一时性的,不是处理咱们成绩的好办法.
别的,在asp中有一对象application,可以保留公用的参数,这也算点缓存,但在php,我至今没看到开辟者产出这类对象,切实其实,没需要.asp.net的页面缓存手艺就用的是viewstate,而cache就是文件联系关系,(纷歧定正确),文件被修正,更新缓存,文件没被修正并且不超时(正文1),就读取缓存,前往了局,就是这个思绪,看看这个源码:

<?php
class cache{
/*
Class Name: cache
Des cription: control to cache data,$cache_out_time is a array to save cache date time out.
Version: 1.0
Author: 老农 cjjer
Last modify:2006-2-26
Author URL:http://www.cjjer.com
*/
private $cache_dir;
private $expireTime=180;//缓存的工夫是 60 秒
function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn('缓存文件不存在并且不克不及创立,需求手动创立.');
return false;
}
}
$this->cache_dir = $cache_dirname;
}
function __destruct(){
echo 'Cache class bye.';
}
function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $_SERVER['REQUEST_URI'];
}else{
$url = $_SERVER['s cript_NAME'];
$url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
}
return $url;
}
function warn($errorstring){
echo "<b><font color='red'>产生毛病:<pre>".$errorstring."</pre></font></b>";
}
function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){
$this->warns('没法翻开缓存文件.');//trigger_error
return false;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns('没法锁定缓存文件.');//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//写入字撙节,serialize写入其他格局
$this->warns('没法写入缓存文件.');//trigger_error
return false;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
return true;
}
function display_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn('没法读取缓存文件.');//trigger_error
return false;
}
echo '读取缓存文件:'.$cacheFile;
//return unserialize(file_get_contents($cacheFile));
$fso = fopen($cacheFile, 'r');
$data = fread($fso, filesize($cacheFile));
fclose($fso);
return $data;
}
function readData($cacheFile='default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile;
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$data="from here wo can get it from mysql database,update time is <b>".date('l dS \of F Y h:i:s A')."</b>,过时工夫是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
$this->cache_page($cacheFile,$data);
}
return $data;
}
}
?>

上面我打断这个代码逐行注释.
三:法式透析
这个缓存类(类没甚么好怕的.请持续看)称号是cache,有2个属性:

private $cache_dir;
private $expireTime=180;

$cache_dir是缓存文件所放的绝对网站目次的父目次, $expireTime(正文一)是咱们缓存的数据过时的工夫,次要是这个思绪:
当数据或文件被加载的时分,先判别缓存文件存在不,前往false ,文件最初修正工夫弛缓存的工夫和比以后工夫大不,大的话申明缓存还没到期,小的话前往false,当前往false的时分,读取原始数据,写入缓存文件中,前往数据.,
接着看法式:
function __construct($cache_dirname){
if(!@is_dir($cache_dirname)){
if(!@mkdir($cache_dirname,0777)){
$this->warn('缓存文件不存在并且不克不及创立,需求手动创立.');
return false;
}
}
$this->cache_dir = $cache_dirname;
}
当类第一次被实例的时分机关默许函数带参数缓存文件称号,如文件不存在,创立一个有编纂权限的文件夹,创立掉败的时分抛出异常.然后把cache类的 $cache_dir属性设置为这个文件夹称号,咱们的一切缓存文件都是在这个文件夹上面的.
function __destruct(){
echo 'Cache class bye.';
}
这是class类的析构函数,为了演示,咱们输入一个字符串暗示咱们释放cache类资本胜利.
function warn($errorstring){
echo "<b><font color='red'>产生毛病:<pre>".$errorstring."</pre></font></b>";
}

这个办法输入毛病信息.

function get_url() {
if (!isset($_SERVER['REQUEST_URI'])) {
$url = $_SERVER['REQUEST_URI'];
}else{
$url = $_SERVER['s cript_NAME'];
$url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
}
return $url;
}
这个办法前往以后url的信息,这是我看国外良多人的cms体系如许做,次要是缓存x.php?page=1,x.php?page=2,等这类文件的,这里列出是为了扩大的这个cache类功效的.

function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){
$this->warns('没法翻开缓存文件.');//trigger_error
return false;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns('没法锁定缓存文件.');//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//写入字撙节,serialize写入其他格局
$this->warns('没法写入缓存文件.');//trigger_error
return false;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
return true;
}

cache_page办法分离传入的是缓存的文件称号和数据,这是把数据写到文件里的办法,先用fopen翻开文件,然后挪用句柄锁定这个文件,然后用fwrite写入文件,最初释放这个句柄,任何一步产生毛病将抛失足误. 您能够看到 这个正文
写入字撙节,serialize写入其他格局
,特地一提的是假如咱们要把一个数组,(可以从MySQL数据库外面select查询除的了局)用serialize函数写入,用unserialize读取到本来的类型.
function display_cache($cacheFile){
if(!file_exists($cacheFile)){
$this->warn('没法读取缓存文件.');//trigger_error
return false;
}
echo '读取缓存文件:'.$cacheFile;
//return unserialize(file_get_contents($cacheFile));
$fso = fopen($cacheFile, 'r');
$data = fread($fso, filesize($cacheFile));
fclose($fso);
return $data;
}

这是由文件称号读取缓存的办法,直接翻开文件,读取全体,假如文件不存在的或没法读取的话前往false,固然,你感应不人道的话,可以从头生成缓存.

function readData($cacheFile='default_cache.txt'){
$cacheFile = $this->cache_dir."/".$cacheFile;
if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
$data=$this->display_cache($cacheFile);
}else{
$data="from here wo can get it from mysql database,update time is <b>".date('l dS \of F Y h:i:s A')."</b>,过时工夫是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
$this->cache_page($cacheFile,$data);
}
return $data;
}
这个函数是咱们挪用的办法,可以写成接口的办法,由传入参数判别文件存在不,文件最初修正工夫+expireTime的工夫是否是过了以后工夫(大于的话申明没有过时),假如文件不存在或已过时,从头加载原始数据,这里,为了复杂时代,咱们是直接源是字符串,您可以把cache类承继某类,取到数据库的数据.(正文2)
四: 增补申明,结语
正文一 :这个缓存的工夫您可以本人调,可以依据工夫情形读取数组,xml,缓存等,请依照您的便利,值得一提的是缓存的工夫(也就是缓存的key)也用缓存掌握,.这在cms体系中被普遍利用,他们把要更新的key放在缓存中,十分轻易掌握全战.
正文二: php5入手下手撑持类承继,这是让人高兴的,把网站全局歇息写在一个设置装备摆设的类外面,再写与数据层交互的类(如与MySQL交互的类),咱们的这个cache类承继数据交互的类,可以十分轻易的读取数据库,这是外话,此处不再睁开,有工夫和人人详谈.

出格申明,这个类文件针对的php5以上版本,其他版本的请不要利用类.
from:  http://www.cjjer.com/blog/news.asp?id=393
更多缓存类建议参考这里:http://www.21andy.com/blog/category/collection/script/

学习了六个多月PHP了,还是个新手,在这里受到了很多人的帮助,谢谢你们!
小妖女 该用户已被删除
沙发
发表于 2015-2-4 09:39:13 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
山那边是海 该用户已被删除
板凳
发表于 2015-2-6 21:23:51 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
爱飞 该用户已被删除
地板
发表于 2015-2-9 02:09:28 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
简单生活 该用户已被删除
5#
发表于 2015-2-9 19:55:48 | 只看该作者
实践是检验自己会不会的真理。
飘灵儿 该用户已被删除
6#
发表于 2015-2-19 01:20:30 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
只想知道 该用户已被删除
7#
发表于 2015-3-6 12:02:15 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
不帅 该用户已被删除
8#
发表于 2015-3-12 16:37:50 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
小魔女 该用户已被删除
9#
发表于 2015-3-16 04:51:21 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
谁可相欹 该用户已被删除
10#
发表于 2015-3-17 17:08:26 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
莫相离 该用户已被删除
11#
发表于 2015-3-24 12:37:45 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
活着的死人 该用户已被删除
12#
发表于 2015-3-25 08:56:44 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
分手快乐 该用户已被删除
13#
发表于 2015-3-31 13:20:30 | 只看该作者
做为1门年轻的语言,php一直很努力。
因胸联盟 该用户已被删除
14#
发表于 2015-4-4 12:27:42 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
第二个灵魂 该用户已被删除
15#
发表于 2015-4-12 03:36:37 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
老尸 该用户已被删除
16#
发表于 2015-4-14 23:16:30 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
再现理想 该用户已被删除
17#
发表于 2015-4-16 17:51:45 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
变相怪杰 该用户已被删除
18#
发表于 2015-4-22 06:41:34 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
冷月葬花魂 该用户已被删除
19#
发表于 2015-4-30 01:44:29 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
蒙在股里 该用户已被删除
20#
发表于 2015-5-1 10:09:25 | 只看该作者
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表