使用PHP静态变量作为缓存方法

下面的PHP代码实例用于帮助用户重设密码。RequestResetPassword是接收用户重置密码的要求和相应的检查。为了更好的重用性,我将重置密码操作分别新ResetPassword功能。更改密码后,我打电话给sendemail发送通知邮件给用户。
复制代码代码如下所示:

*用户请求接收方重置密码。
* /
功能requestresetpassword(){
检查用户是否存在
如果(!checkuserexists($ _get { 'userid ' })){
退出(对不起,该用户不存在,请确认用户的账号。);
}
ResetPassword($ _get { 'userid});
最后,向用户发送电子邮件
sendemail($ _get { } 'userid ','重置密码成功','新的密码是XXXX);
出口(新密码已发送到您的邮箱。);
}


*帮助用户重设密码
* /
功能ResetPassword($ userid){
检查用户是否存在
如果(!checkuserexists($)){
返回false;
}

重新设置用户密码操作
省略…
返回true;
}


*发送电子邮件给用户
* /
功能sendemail($$ $标题,内容){
检查用户是否存在
如果(!checkuserexists($)){
返回false;
}

发送邮件操作
省略…
返回true;
}


*检查用户是否存在
* /
功能checkuserexists($ userid){
用户名= getuserinfo($);
返回!空($用户);
}


*获取用户数据
* /
功能getuserinfo($ userid){
函数假定我有一个查询,它用于查询数据库并返回数据。
用户名=查询(SELECT * FROM `用户`哪里` UID ` =。intval($));
返回is_array($用户)用户:阵列(美元);
}

问题是,这三种功能同时使用checkuserexists函数来检查用户不存在。数据库查询三次,这会带来一些额外的开销。
如果你想删除三者之间的任何checkuserexists,它似乎是可能的。但如果有些函数调用ResetPassword或sendemail以后,可能是系统错误时,用户不存在。
另一个办法是写进requestresetpassword ResetPassword逻辑,和更多一点,写sendemail逻辑。这样就减少了函数调用,数据库查询一次,提高了性能,但复位和发送邮件的功能将不被重用,和单一责任原则的违背,和代码的复杂度也有所提高。
然而,由于功能分离和重用性很好,如果实际性能受到影响,我们可以考虑使用缓存来减少数据库查询。我已经改变了checkuserexists功能共享的。
复制代码代码如下所示:

*检查用户是否存在
* /
功能checkuserexists($ userid){
添加一个缓存,记录用户的检查结果
静态缓存=数组();

检查当前用户是否检查了
如果(isset($缓存{ $用户名})){
返回的缓存用户名} { $;
}

用户名= getuserinfo($);
缓存中记录的结果
{用户名} =美元美元的缓存!空($用户);

返回的缓存用户名} { $;
}

它也有可能的getuserinfo功能变化以相同的方式。
可以看出,当代码的可重用性得到改善时,很容易提高性能,并且很容易发现和修改性能瓶颈。
虽然这个例子不够大,但仍有一些更有影响力的例子。例如,遍历,我可以封装成一个函数遍历重复多次使用它。这些费用太多,在我所有的项目的影响,还是很少的。所以我宁愿把时间花在如何提高代码的可重用性和可维护性,不要浪费太多的性能。如果实际的表现真的是不需要的,也是衡量硬件配置。