使用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&MYSQL服务器配置说明
Oct 09 PHP
PHP 中英文混合排版中处理字符串常用的函数
Apr 12 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
Thinkphp中import的几个用法详细介绍
Jul 02 PHP
PHP生成压缩文件实例
Feb 07 PHP
php实现比较两个字符串日期大小的方法
May 12 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
Oct 08 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
Jul 09 PHP
php实现的pdo公共类定义与用法示例
Jul 19 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图片验证码代码
2008/03/27 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
在线编辑器的实现原理(兼容IE和FireFox)
2007/03/09 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
Javascript Global对象
2009/08/13 Javascript
再论Javascript的类继承
2011/03/05 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
IE中图片的onload事件无效问题和解决方法
2014/06/06 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
微信小程序实现运动步数排行功能(可删除)
2018/07/05 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
python队列queue模块详解
2018/04/27 Python
对python中Json与object转化的方法详解
2018/12/31 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
python 实现屏幕录制示例
2019/12/23 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
致共产党员倡议书
2014/04/16 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
美容院员工规章制度
2015/08/05 职场文书
python 提取html文本的方法
2021/05/20 Python
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
千万级用户系统SQL调优实战分享
2022/03/03 MySQL
java实现web实时消息推送的七种方案
2022/07/23 Java/Android