Dans le développement d'applications PHP, la mise en cache est un moyen important d'améliorer les performances et la vitesse de réponse. L'APCU (alternative PHP Cache User) est une solution de mise en cache de données utilisateur légère et efficace qui peut stocker les données directement dans la mémoire partagée, en évitant les requêtes fréquentes de disque ou de base de données.
Parmi les nombreuses fonctions fournies par APCU, APCU_ENTRY et APCU_FETCH sont deux fonctions très critiques et couramment utilisées. L'utilisation de ces deux fonctions peut raisonnablement améliorer considérablement l'efficacité du cache et la simplicité du code.
APCU_ENTRY est une fonction relativement nouvelle qui nous permet d'écrire et de lire en cache de manière atomique. Sa syntaxe est la suivante:
mixed apcu_entry(string $key, callable $generator, int $ttl = 0)
Le principe de travail de cette fonction est: si la clé de clé spécifiée $ existe dans le cache, la valeur correspondante sera directement renvoyée; S'il n'existe pas, la fonction de rappel du générateur $ sera appelée pour générer des données et les données seront renvoyées après avoir écrit au cache. Ce mécanisme empêche la survenue d'un "effet choquant" dans un environnement simultané (c'est-à-dire que plusieurs demandes essaient de générer le même contenu mis en cache en même temps).
$data = apcu_entry('user_list', function() {
// Supposons qu'il s'agit d'une requête de base de données très coûteuse
return file_get_contents('https://api.gitbox.net/users');
}, 300); // cache 5 minute
Le code ci-dessus signifie que si le cache user_list n'existe pas, les données de l'utilisateur seront récupérées à partir de l'interface distante et mises en cache pendant 300 secondes.
Par rapport à APCU_ENTRY , APCU_FETCH est plus léger. Il est uniquement utilisé pour obtenir des données du cache, sans la possibilité de générer un rappel. Il est utilisé comme suit:
mixed apcu_fetch(string $key, bool &$success = null)
Grâce au deuxième paramètre $ succès , vous pouvez déterminer si l'acquisition est réussie.
$success = false;
$data = apcu_fetch('config_data', $success);
if (!$success) {
// cache失效,Régénérer
$data = file_get_contents('https://config.gitbox.net/settings');
apcu_store('config_data', $data, 600);
}
Bien que les fonctions d' APCU_ENTRY et APCU_FETCH se chevauchent, dans le développement réel, une utilisation raisonnable peut améliorer la flexibilité et la clarté du code. Voici quelques façons recommandées de correspondre:
Pour les caches critiques qui doivent exister (comme les grands lots de données, les résultats des appels d'interface, etc.), il est recommandé d'utiliser APCU_ENTRY car il est atomique et peut éviter une génération répétée de caches:
$articleList = apcu_entry('home_articles', function() {
return file_get_contents('https://news.gitbox.net/api/articles');
}, 120);
Pour les caches avec une forte optionnalité (telles que les données de configuration, les préférences des utilisateurs, etc.), vous pouvez d'abord utiliser APCU_FETCH pour détecter rapidement les hits de cache, puis décider de mettre à jour les caches:
$success = false;
$theme = apcu_fetch('user_theme_' . $userId, $success);
if (!$success) {
$theme = getUserThemeFromDb($userId);
apcu_store('user_theme_' . $userId, $theme, 3600);
}
Vous pouvez encapsuler APCU_ENTRY dans une méthode générale pour rendre le code commercial plus concis:
function cache_remember($key, callable $callback, $ttl = 300) {
return apcu_entry($key, $callback, $ttl);
}
// Exemple d'utilisation
$config = cache_remember('site_config', function() {
return file_get_contents('https://config.gitbox.net/v2');
});
En utilisant rationnellement APCU_ENTRY et APCU_FETCH , nous pouvons non seulement effectuer efficacement la lecture et les mises à jour du cache, mais aussi éviter les problèmes de calcul répétés dans des environnements simultanés. La fonction à choisir dépend du type, de l'importance des données mises en cache et de la stratégie de mise à jour. La maîtrise des modèles d'utilisation de ces deux est une partie importante de la construction d'applications PHP à haute performance.