使用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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
Dec 11 PHP
php输入流php://input使用浅析
Sep 02 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
php获取'/'传参的值简单方法
Jul 13 PHP
Yii2框架控制器、路由、Url生成操作示例
May 27 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 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
JS 建立对象的方法
2007/04/21 Javascript
JavaScript中使用replace结合正则实现replaceAll的效果
2010/06/04 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
D3.js实现折线图的方法详解
2016/09/21 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
python 算法 排序实现快速排序
2012/06/05 Python
如何将python中的List转化成dictionary
2016/08/15 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
浅谈python3中input输入的使用
2019/08/02 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
使用Python完成15位18位身份证的互转功能
2019/11/06 Python
Python如何实现FTP功能
2020/05/28 Python
Python如何读取、写入CSV数据
2020/07/28 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
全球度假村:Club Med
2017/11/27 全球购物
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
美国修容界大佬创建的个人美妆品牌:Kevyn Aucoin Beauty
2018/12/12 全球购物
自荐信模版
2013/10/24 职场文书
计算机网络专业推荐信
2013/11/24 职场文书
管理心得体会
2013/12/28 职场文书
《口技》教学反思
2014/02/21 职场文书
升国旗仪式主持词
2014/03/19 职场文书
高中学生评语大全
2014/04/25 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android