使用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 fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
PHP分多步骤填写发布信息的简单方法实例代码
Sep 23 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
PHP实现的封装验证码类详解
Jun 18 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
Sep 16 PHP
PHP图片库imagemagick安装方法
Sep 23 PHP
php生成shtml类用法实例
Dec 09 PHP
php实现图片转换成ASCII码的方法
Apr 03 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
php可变长参数处理函数详解
Feb 22 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
Mar 17 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入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
php 判断数组是几维数组
2013/03/20 PHP
php利用事务处理转账问题
2015/04/22 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
Python生成pdf文件的方法
2014/08/04 Python
Python性能优化技巧
2015/03/09 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
python将字符串转换成json的方法小结
2019/07/09 Python
python如何更新包
2020/06/11 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
机械设计职业生涯规划书
2013/12/27 职场文书
留学推荐信怎么写
2014/01/25 职场文书
地球一小时倡议书
2014/04/15 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
艺术节开幕词
2015/01/28 职场文书
建筑工程催款函
2015/06/24 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫