使用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基础知识:类与对象(1)
Dec 13 PHP
加强版phplib的DB类
Mar 31 PHP
基于PHP静态类的原罪详解
May 06 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
Dec 02 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
ucenter通信原理分析
Jan 09 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
php头像上传预览实例代码
May 02 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
php引用传递
Apr 01 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使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
Jquery 学习笔记(一)
2009/10/13 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
js实现日历
2020/11/07 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
Python函数学习笔记
2008/10/07 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
python3爬取数据至mysql的方法
2018/06/26 Python
python hashlib加密实现代码
2019/10/17 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
区分python中的进程与线程
2020/08/13 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
Pandas之缺失数据的实现
2021/01/06 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
庆八一活动方案
2014/01/25 职场文书
售后求职信范文
2014/03/15 职场文书
目标管理责任书
2014/04/15 职场文书
求职信标题怎么写
2014/05/26 职场文书
节能标语大全
2014/06/21 职场文书
安全生产知识竞赛活动总结
2014/07/07 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
个人买房协议书范本
2014/10/06 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
windows安装python超详细图文教程
2021/05/21 Python
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android