Maison  >  Article  >  développement back-end  >  Comment utiliser les variables statiques PHP comme cache pour réduire la duplication de code

Comment utiliser les variables statiques PHP comme cache pour réduire la duplication de code

伊谢尔伦
伊谢尔伦original
2017-06-30 11:25:281403parcourir

Cet article explique comment utiliser les variables statiques PHP lors de la mise en cache, réduisant la duplication de code et optimisant les performances du programme

L'exemple de code PHP suivant est destiné à aider les utilisateurs à réinitialisez le mot de passe, requestResetPassword reçoit la demande de l'utilisateur pour réinitialiser le mot de passe et effectue les vérifications correspondantes. Pour une meilleure réutilisabilité, j'ai attribué l'opération de réinitialisation du mot de passe à une nouvelle fonction resetPassword Après avoir changé le mot de passe, j'ai appelé sendEmail pour envoyer un e-mail de notification à l'utilisateur.

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

Le problème maintenant est que ces trois fonctions utilisent toutes la fonction checkUserExists pour vérifier que l'utilisateur n'existe pas. La base de données est interrogée trois fois, ce qui entraîne une surcharge supplémentaire.
Si vous souhaitez supprimer un checkUserExists parmi les trois, cela semble possible. Cependant, si certaines fonctions appellent ultérieurement resetPassword ou sendEmail et que l'utilisateur n'existe pas, une erreur peut se produire dans le système.
Une autre solution consiste à écrire la logique de resetPassword dans requestResetPassword, et un peu plus tard, d'y écrire également la logique de sendEmail. De cette façon, les appels de fonction sont réduits, les requêtes de base de données deviennent uniques et les performances sont améliorées. Cependant, les fonctions de réinitialisation des mots de passe et d'envoi d'e-mails ne seront pas réutilisables et violeront le principe de responsabilité unique, et la complexité du code augmentera également.
Cependant, comme la séparation et la réutilisabilité des fonctions sont très bonnes, si les performances réelles sont affectées, vous pouvez envisager d'utiliser la mise en cache pour réduire les requêtes de base de données. J'ai modifié la fonction checkUserExists qu'ils partagent :

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

Vous pouvez également utiliser la même méthode pour modifier la fonction getUserInfo.
Vous pouvez voir ici que lorsque la réutilisabilité du code est améliorée, il est très simple d'améliorer les performances, et les goulots d'étranglement des performances sont également faciles à découvrir et à modifier.
Bien que cet exemple n'ait pas un impact suffisamment important sur les performances, certains ont un impact plus important, comme le parcours, je peux encapsuler le parcours dans une fonction pour le réutiliser et l'utiliser plusieurs fois. Ces dépenses n’ont pas eu un impact aussi important que prévu sur mon projet, ou alors elles ont été minimes. Je préfère donc consacrer mon temps à améliorer la réutilisabilité et la maintenabilité du code plutôt que de me soucier de gaspiller davantage de performances. Si les performances réelles ne répondent vraiment pas aux exigences, vous pouvez également envisager d'augmenter la configuration matérielle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn