查看完整版本: 编写快速,安全的PHP代码---异步更新缓存机制

lily 2007-8-1 22:30

编写快速,安全的PHP代码---异步更新缓存机制

             <p>编写快速,安全的<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'PHP');" target="_self"><u><strong>PHP</strong></u></a>代码---异步更新缓存机制<BR><BR>先简单说下什么是缓存以照顾新手:缓存简单说来就是把一个<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%B4%FA%C2%EB');" target="_self"><u><strong>代码</strong></u></a>执行过程产生的输出保存起来,可以存放在硬盘,内存,或者其他服务器上,<BR>以后同样请求在允许条件范围内这个过程就不再执行了,直接从缓存中取的相关数据,来完成最后的输出,超过此条件,缓存文件又重新更新。<BR>缓存可以是任意格式的文件,内容也可以是完整的<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'HTML');" target="_self"><u><strong>HTML</strong></u></a>,HTML片段,<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'XML');" target="_self"><u><strong>XML</strong></u></a>,几个字符,一串字符串,比较常见的就是缓存文件例如<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'smarty');" target="_self"><u><strong>smarty</strong></u></a>,smarttemplate模版的缓存,这个就是保存的html片断,而<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%BF%AA%D4%B4');" target="_self"><u><strong>开源</strong></u></a>的discuz,phpwind等论坛程序,就是保存的字符串,这个字符串的特点就是一段完整的PHP代码,直接用include包含这个缓存文件就可以得到相关数组。还有些格式比如说小巧的sqlite,将PHP序列化为字符串保存在文件里,用的时候再反序列化等手段,其过程都是类似的。<BR><BR>现在说更新缓存:通常的做法是在取缓存的时候先根据相关条件(如模版改动,缓存过期,<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" target="_self"><u><strong>数据库</strong></u></a>变动等)判断缓存文件是否需要更新,如需更新则直接进行缓存更新,所以,一般有这样的代码片段:(以伪代码示例)<BR><BR>if(需要更新缓存==true){<BR>这里就是缓存文件产生过程<BR>}else{<BR>取缓存文件的数据<BR>}<BR><BR>这样的方式可以称为同步更新缓存,同步更新有几个缺点 ,一是并发大了的情况,在更新文件的同时,另一个进程正在包含这个文件,有可能造成文件读写错误,二是如果更新过程过于慢长,用户端得到的一片空白,严重降低了用户体验,没有人愿意花钱看空白吧。<BR><BR>可以采取异步更新的机制来完善以上2个缺陷:<BR>当服务端检查到缓存需要更新,但并不立即更新,输出javascript对客户端进行提示(需要更新缓存,请等待)或者压根就不提示用户,而采用过去缓存,并使用<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'ajax');" target="_self"><u><strong>ajax</strong></u></a>或者包含<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%BF%F2%BC%DC');" target="_self"><u><strong>框架</strong></u></a>的方式再次请求服务器,这次服务器才更新缓存,下一次请求就稍做检查就用上新缓存了,这样很容易的解决了以上问题,用户体验也不错,感觉不到空白的延迟时间段。<BR><BR>举一个很简单的例子来说明异步更新缓存的过程:<BR>用户查询名字为包含xxx的数据:很明显这个查询语句是select name from table where name like '%xxx%'<BR>like是全表搜索,name上的索引无效,我们可以把这个查询出来的数据做成xml,或者直接序列化结果保存在文件,文件名就为xxx,如果是搜索yyy的话,我们建立的文件名可以是yyy,遇见下一次查询用户名为xxx的时候,我们就可以直接取这个xxx缓存文件,从而饶开了查询数据库,这个是很好理解的,大家没什么问题吧。<BR>如果某时间insert了name包含xxx的数据,再新的查询中,我们需要进行缓存更新,现在我们则采用异步更新缓存的思路进行:直接给客户端返回js,提示需要等待更新,当新的xxx文件更新之后,服务端再输出js通知更新完毕,然后直接进行结果查看页,这个过程强调了用户体验,用户根本看不到空白的等待返回结果的信息,感觉到整个过程更加流畅。<BR><BR>这样的做法在mop上比较多,大家可以看看,网速快的效果不明显,可以限制网速进行查看<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%D1%A7%CF%B0');" target="_self"><u><strong>学习</strong></u></a>。<BR>有不懂的地方欢迎和我交流。第一次写文章,问题很多,欢迎指出不足之处,欢迎大家探讨。谢谢大家。</p>     <center><input type="image" onclick=copyToClipBoard() src="http://www.phpchina.com/images/phpcn_book_bu_tj.gif" border="0"></center>
页: [1]
查看完整版本: 编写快速,安全的PHP代码---异步更新缓存机制
PageRank