- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- NBT11126-2023煤矿用主动式隔仰爆装置应用技术规范.docx VIP
- 民航旅客运输(第2版)全套教学课件.pptx
- 300T汽车吊性能说明书-XCA300_1全地面起重机技术规格书+[主臂风电臂加超起].pdf VIP
- 新初级招采人员《招标采购法律法规》考试复习题库-上(单选题汇总).doc VIP
- GB29743.1-2022 机动车冷却液 第1部分:燃油汽车发动机冷却液.pdf VIP
- 1905运顺回撤U型钢棚安全技术措施(2023.3.30).docx VIP
- FSC管理手册程序文件制度文件表单一整套.doc VIP
- 施工质量管理标准化图集.pptx
- 【公开课课件】高考英语读后续写10.pptx VIP
- 2023年大连大学计算机科学与技术专业《计算机网络》科目期末试卷B(有答案).docx VIP
原创力文档


文档评论(0)