使用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获得当前的脚本网址
Dec 10 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
浅析linux下apache服务器的配置和管理
Aug 10 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
CodeIgniter扩展核心类实例详解
Jan 20 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
Oct 03 PHP
php 使用 __call实现重载功能示例
Nov 18 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服务器实现多session并发运行
2006/10/09 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
javascript 解析url的search方法
2010/02/09 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
使用js和canvas实现时钟效果
2020/09/08 Javascript
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
Python生成pdf文件的方法
2014/08/04 Python
跟老齐学Python之用while来循环
2014/10/02 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
中学教师教育感言
2014/02/21 职场文书
促销活动方案模板
2014/02/24 职场文书
安全目标管理责任书
2014/07/25 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
能用CSS实现的就不要麻烦JavaScript了
2021/10/05 HTML / CSS