Home  >  Article  >  Backend Development  >  How to use php static variables as cache to reduce code duplication

How to use php static variables as cache to reduce code duplication

伊谢尔伦
伊谢尔伦Original
2017-06-30 11:25:281403browse

This article introduces how to use PHP static variablesWhen caches, reduce repeated code execution, and optimize program performance

The following PHP code example functions to help users To reset the password, requestResetPassword receives the user's request to reset the password and performs corresponding checks. For better reusability, I assigned the password reset operation to a new resetPassword function , and then called sendEmail to send a notification email to the user after changing the password.

/**
 * 用户请求重置密码的接收器
 */
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() ;
}

The problem now is that these three functions all use the checkUserExists function at the same time to check that the user does not exist. The database is queried three times, which brings some additional overhead.
If you want to remove any checkUserExists among the three, it seems possible. However, if some functions later call resetPassword or sendEmail, and the user does not exist, an error may occur in the system.
Another solution is to write the logic of resetPassword into requestResetPassword, and a little later, write the logic of sendEmail into it. In this way, function calls are reduced, database queries become one time, and performance is improved. However, the functions of resetting passwords and sending emails will not be reusable, and violate the principle of single responsibility, and the code complexity will also increase.
However, because function separation and reusability are very good, if the actual performance is affected, you may consider using caching to reduce database queries. I changed the checkUserExists function they share:

/**
 * 检查某个用户是否存在
 */
function checkUserExists( $userid ) {
    //增加一个缓存,用以记录检查用户的结果
    static $cache = array();
    //检查当前用户是否已经检查过一次
    if( isset( $cache[ $userid ] ) ) {
        return $cache[ $userid ];
    }
    $user = getUserInfo( $userid );
    //把结果记录到缓存中
    $cache[ $userid ] = !empty( $user );
    return $cache[ $userid ];
}


You can also use the same method to change the getUserInfo function.
You can see here that when the reusability of code is improved, it is very simple to improve performance, and performance bottlenecks are also easy to be discovered and modified.
Although this example does not have a big enough impact on performance, there are others that have a greater impact, such as traversal. I may encapsulate the traversal into a function for reuse and use it multiple times. These expenses did not have as big an impact on my project as expected, or they were minimal. So I prefer to spend my time on how to improve the reusability and maintainability of the code, rather than worrying about wasting more performance. If the actual performance really does not meet the requirements, you can also consider increasing the hardware configuration.

The above is the detailed content of How to use php static variables as cache to reduce code duplication. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn