使用PHP静态变量当缓存的方法


Posted in PHP onNovember 13, 2013

下面这个PHP的代码实例,功能是帮助用户重置密码,requestResetPassword是接收用户重置密码的请求并且做了相应的检查。为了更好的复用性,我将重置密码的操作单独分配到一个新的resetPassword的函数,更改完密码的后再调用sendEmail向用户发送一封通知邮件。

/**
 * 用户请求重置密码的接收器
 */
function requestResetPassword() {
    //检查用户是否存在
    if( !checkUserExists( $_GET['userid'] ) ) {
        exit('抱歉,用户不存在,请确认用户帐号。');
    }
    resetPassword( $_GET['userid'] );
    //最后向用户发送一封邮件
    sendEmail( $_GET['userid'], '重置密码成功', '新的密码是xxxx' );
    exit('新密码已经发送到你的邮箱。');
}/**
 * 帮助用户重置密码
 */
function resetPassword( $userid ) {
    //检查用户是否存在
    if( !checkUserExists( $userid ) ) {
        return false;
    }
    //进行重置用户密码的操作
    //略...
    return true;
}
/**
 * 向用户发送一封邮件
 */
function sendEmail( $userid, $title, $content ) {
    //检查用户是否存在
    if( !checkUserExists( $userid ) ) {
        return false;
    }
    //发送邮件操作
    //略...
    return true;
}
/**
 * 检查某个用户是否存在
 */
function checkUserExists( $userid ) {
    $user = getUserInfo( $userid );
    return !empty( $user );
}
/**
 * 获取某个用户的数据
 */
function getUserInfo( $userid ) {
    //假设我有一个query的函数,它用来查询数据库并返回数据
    $user = query( "SELECT * FROM `user` WHERE `uid`=" . intval( $userid ) );
    return is_array( $user ) ? $user : array() ;
}

现在问题是,这三个函数都同时使用checkUserExists这个函数来检查用户不存在,数据库查询了三次,这样带来了一些额外的开销。
如果要去掉三者之间任意一个checkUserExists,看上去是可能的。但是如果之后有某些功能要调用resetPassword或者sendEmail,用户不存在时,系统可能会发生错误。
还有一个解决方法是,将resetPassword的逻辑写到requestResetPassword里,再过一点,把sendEmail的逻辑也写进去。这样函数调用减少,数据库查询也变成一次了,性能得到了提高。但是重置密码和发送邮件的功能将不能得到复用,并且违背了单一责任的原则,代码复杂度也提高了。
不过,因为函数分离和复用性都很好,如果实际性能受到影响,可能考虑用缓存的方法减少数据库查询,我改动了它们共用的checkUserExists函数:
/**
 * 检查某个用户是否存在
 */
function checkUserExists( $userid ) {
    //增加一个缓存,用以记录检查用户的结果
    static $cache = array();    //检查当前用户是否已经检查过一次
    if( isset( $cache[ $userid ] ) ) {
        return $cache[ $userid ];
    }
    $user = getUserInfo( $userid );
    //把结果记录到缓存中
    $cache[ $userid ] = !empty( $user );
    return $cache[ $userid ];
}

也可以用同样的方法改动getUserInfo函数。
这里可以看到,当代码的复用性提高时,想提高性能是很简单的,性能的瓶颈也很容易被发现和修改。
尽管这个例子对性能影响还不够大,还有一些影响更大的,比如说遍历,我可能为了复用而将遍历封装到一个函数中,并且多次使用它。这些开销对我的项目根本没有预想中那样有太大的影响,或者说是微乎其微的。所以我更愿意把时间花在如何提高代码的复用性和维护性方面,而不是纠结于浪费多这一点性能。实际性能如果真的达不到要求,也可以权衡增加硬件配置。
PHP 相关文章推荐
php 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
XAMPP安装与使用方法详细解析
Nov 27 PHP
php解决约瑟夫环示例
Apr 09 PHP
PHP多线程类及用法实例
Dec 03 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
php实现mysql数据库分表分段备份
Jun 18 PHP
PHP图片加水印实现方法
May 06 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
Nov 16 PHP
利用PHP实现一个简单的用户登记表示例
Apr 25 PHP
Yii框架创建cronjob定时任务的方法分析
May 23 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
Jan 15 PHP
使用phpQuery采集网页的方法
Nov 13 #PHP
phpQuery占用内存过多的处理方法
Nov 13 #PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
Nov 13 #PHP
php堆排序(heapsort)练习
Nov 13 #PHP
php生成EAN_13标准条形码实例
Nov 13 #PHP
使用php计算排列组合的方法
Nov 13 #PHP
测试php函数的方法
Nov 13 #PHP
You might like
用PHP开发GUI
2006/10/09 PHP
社区(php&&mysql)六
2006/10/09 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
深入理解js promise chain
2016/05/05 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
2018/01/31 Javascript
Angular4学习笔记router的简单使用
2018/03/30 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
js实现扫雷源代码
2020/11/27 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
python模拟登陆,用session维持回话的实例
2018/12/27 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
有关打架的检讨书
2014/01/25 职场文书
书香校园活动方案
2014/02/28 职场文书
安全标语大全
2014/06/10 职场文书
优秀教师推荐材料
2014/12/16 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
golang日志包logger的用法详解
2021/05/05 Golang