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.
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.
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.
$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.
$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.
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 | ? | ? |
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
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.