Position actuelle: Accueil> Derniers articles> Différences entre APCU_ENTRY ET APCU_ADD et Scénarios d'application

Différences entre APCU_ENTRY ET APCU_ADD et Scénarios d'application

gitbox 2025-05-26

Lorsque vous utilisez l'extension du cache APCU de PHP, les développeurs entrent souvent en contact avec les deux fonctions: apcu_entry () et apcu_add () . Ils sont tous utilisés pour écrire des données dans le cache, mais il existe des différences évidentes de comportement et de scénarios applicables. Cet article analysera les différences entre les deux du point de vue des principes de mise en œuvre, des scénarios d'utilisation et des performances, et les expliquent en combinaison avec des exemples réels.

1. Concepts de base

apcu_add (string $ key, mixtes $ var, int $ ttl = 0): bool

Cette fonction ajoute une valeur au cache, et si la clé $ spécifiée existe déjà, l'ajout échoue, renvoyant faux . Cela signifie que APCU_ADD () est une opération "Ajouter une seule fois", souvent utilisée pour l'initialisation ou les scénarios qui doivent être évités.

APCU_ENTRY (String $ key, Calable $ Generator, int $ ttl = 0): mixte

Cette fonction essaiera d'obtenir la valeur correspondant à $ key à partir du cache; Si la clé n'existe pas, la fonction de rappel de générateur $ est appelée pour générer des données et écrire dans le cache. Son objectif typique est de «chargement paresseux» pour éviter les opérations coûteuses répétées.

2. Comparaison des mécanismes de mise en œuvre

  • Déterminez si la clé existe:

    • APCU_ADD () est atomique, il essaie d'ajouter directement et revient si la clé existe déjà, en évitant les races en lecture-écriture.

    • APCU_ENTRY () essaie d'abord de le lire, s'il manque, alors rappelez pour générer des données et essayez de l'écrire. Cela peut entraîner des calculs répétés en concurrence (bien que la probabilité réelle d'occurrence soit faible).

  • Écrivez un comportement:

    • APCU_ADD () ne remplacera jamais la valeur existante et convient aux situations où vous voulez "définir une fois".

    • apcu_entry () calculera et écrira automatiquement lorsque le cache n'existe pas, adapté au chargement paresseux.

  • Simplicité:

    • APCU_ENTRY () fournit une structure d'encapsulation plus claire, et une ligne de code implémente la lecture du cache + la logique de génération lorsqu'elle est invalidée, avec une sémantique plus claire.

    • APCU_ADD () exige que le développeur écrit manuellement la logique de lecture et de jugement.

3. Utilisez des exemples

1. Utilisez APCU_ADD () pour initialiser les données de configuration qui ne sont exécutées qu'une seule fois

 $config = [
    'site_name' => 'GitBox',
    'max_upload' => 100
];

$key = 'site_config';
if (!apcu_add($key, $config, 3600)) {
    // Existe déjà,Aucun traitement n'est effectué
}

Convient pour les données de configuration écrites dans la phase de déploiement ou d'initialisation, garantissant qu'il n'est pas défini ou écrasé à plusieurs reprises.

2. Utilisez APCU_ENTRY () pour implémenter le calcul automatique du cache

 $data = apcu_entry('user_list', function() {
    // Supposons que cette fonction interroge la base de données
    return file_get_contents('https://gitbox.net/api/users');
}, 600);

Ici, user_list obtient des données et les cache via l'API d'accès lorsqu'elle n'existe pas, ce qui le rend idéal pour la lecture fréquente mais change parfois de données.

4. Chaque scénario d'utilisation approprié

Scène Utilisez APCU_ADD () Utilisez APCU_ENTRY ()
Initialiser les paramètres ? ?
Évitez la couverture ? ?
Généré automatiquement ? ?
Chargement paresseux ? ?
Simplifier la logique du cache ? ?

5. Choses à noter dans des scénarios simultanés

Dans un environnement de concurrence élevé, bien que APCU_ENTRY () soit pratique, sa logique interne n'est pas fortement cohérente. Plusieurs processus peuvent déterminer simultanément que la clé n'existe pas et génère des données. Par conséquent, si le rappel est coûteux ou si le résultat doit être unique, il est recommandé d'ajouter un mécanisme de verrouillage ou d'utiliser APCU_ADD () pour aider au jugement.

 $key = 'report_2025';
if (!apcu_add($key, true, 300)) {
    // La tâche a été exécutée dans un autre processus
    return;
}
generateExpensiveReport();  // Exécutez simplement une fois

6. Résumé

  • L'utilisation d'APCU_ADD () est le meilleur choix lorsque vous souhaitez effectuer une écriture une seule fois;

  • L'utilisation d'APCU_ENTRY () est un moyen plus efficace d'obtenir et de mettre en cache les résultats des calculs automatiquement;

  • Comprendre la différence vous permettra de concevoir plus de manière rationnellement la logique de cache de PHP, d'améliorer les performances des applications et de réduire la consommation de ressources.