PHP函数缓存化.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP函数缓存化

Home » Programming » Memoization in PHP Memoization in PHP J ex — 2010-11-11 原文地址 : http://j ex.im/programming/memoization-in-php.html 谈到PHP应用的性能优化 ,很多人最先想到的肯定是缓存。因为一般的程序 不会用PHP进行太多的计算 ,算法优化的余地很小 ,所以性能瓶颈不会出现 在CPU上,而更可能出现在IO上。而IO操作最需要缓存的莫过于耗时的数据 库查询了。 最常见的缓存使用情形就是类似这样的一次查询 : function query_author_articles($author) { global $pdo,$memcache; $sql SELECT * FROM `articles` WHERE author:autho r ORDER BY `date` DESC; $cacheKey author_{$author}_articles; $results$memcache-get($cacheKey); if (false $results) { //缓存没有命中则执行查询并将结果 保存到memcache中 $sth$pdo-prepare($sql); $sth-bindParam(:author, $author, PDO::PARAM_S TR); $sth-execute(); $results$sth-fetchAll(PDO::FETCH_ASSOC); $memcache-set($cacheKey,$results); } return $results; } 除了SQL查询 ,还有哪些IO情形需要缓存呢 ? —— 当然少不了外部网络接 口请求了 !比如请求Google搜索结果 ,尽管Google服务器处理查询很快 , 但这个请求完成仍需要很长时间,不但因为建立HTT PS连接比建立HTT P连接 更耗时、 以及这个URL会产生302跳转 ,更是因为 (此处已被屏蔽 ,请 自行 脑补 )。示例代码如下 : function search_google($keywords) { global $memcache; $url /search?q .urlencode( $keywords); $results$memcache-get($url); if (false $results) { //缓存没有命中则发起请求 $resultsfile_get_contents($url); $memcache-set($url,$results); } return $results; } 先停下来观察下前面两个典型的缓存案例代码。你会发现什么样的问题 ? 1. 代码重复 !违背了DRY原则。缓存是否命中的检查代码都是一样 的。 并且 ,缓存检查代码与主逻辑代码混杂在一起 ,耦合度高 ,使得程 序逻辑支离破碎。 2. 不同缓存的Key都是人肉管理 ,很难保证不会出现Cache Key相同导 致冲突的问题。 如何逐步解决这些问题呢 ?代码重复,就意味着缺少抽象 !先将这些步骤抽 象一下 ,缓存的使用一般都是这样一个流程 : if 缓存命中 then 返回缓存中的内容 else 执行操作 将操作结果放入缓存并返回结果 end 而其中 “执行操作”这一步才是程序的主逻辑 ,而其它的都是缓存代码的逻 辑。如果要避免代码重复,那就只有将程序主逻辑代码与缓存操作代码分离 开来。那么我们就不得不将原来的一个函数拆分成这样两个函数 : function cache_operation(); //缓存操作代码,可重用 function program(); //程序主体代码 # 以search_google函数为例,抽取掉缓存检查代码后 # 它就露出了原形 —— 我们会惊讶地发现原来主逻辑只有一行代码 function search_google($keywords) { return file_get_contents(/s earch?q .url

文档评论(0)

精品文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档