使用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执行速度全攻略(下)
Oct 09 PHP
在PHP3中实现SESSION的功能(三)
Oct 09 PHP
一些 PHP 管理系统程序中的后门
Aug 05 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
CodeIgniter CLI模式简介
Jun 17 PHP
MyEclipse常用配置图文教程
Sep 11 PHP
php生成rss类用法实例
Apr 14 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
用PHP调用数据库的存贮过程!
2006/10/09 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
详解vue axios中文文档
2017/09/12 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
python登录QQ邮箱发信的实现代码
2013/02/10 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
python框架Django实战商城项目之工程搭建过程图文详解
2020/03/09 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
党务公开方案
2014/05/06 职场文书
2014年村委会工作总结
2014/11/24 职场文书
党纪处分决定书
2015/06/24 职场文书
Redis Lua脚本实现ip限流示例
2022/07/15 Redis