APCU_ENTRY est une fonction fournie par l'extension APCU dans PHP pour cache les données. Il fonctionne similaire à APCU_STORE , mais présente des avantages supplémentaires, en particulier dans des environnements simultanés.
apcu_entry(string $key, callable $value_func, int $ttl = 0): mixed
$ KEY : La clé mise en cache.
$ value_func : une fonction de rappel qui renvoie les valeurs mises en cache. Si l'élément de cache n'existe pas, cette fonction sera appelée pour générer des données.
$ TTL : le temps de survie des données, en secondes. La valeur par défaut est 0, indiquant un cache permanent.
APCU_ENTRY permet aux demandes simultanées d'utiliser la même fonction de rappel si plusieurs demandes essaient de stocker les mêmes données en même temps, mais qu'une seule demande stockera avec succès les données et d'autres demandes utiliseront les données stockées.
Dans un environnement simultané, plusieurs demandes peuvent accéder simultanément aux données en cache. Si plusieurs demandes ne trouvent pas de données dans le cache, elles peuvent exécuter une fonction de rappel simultanément pour générer et stocker les mêmes données. Cela entraînera les problèmes suivants:
Race de données : plusieurs demandes peuvent effectuer des opérations de stockage simultanément, ce qui entraîne des calculs inutiles.
Problèmes de performances : si les éléments de cache sont générés par des calculs complexes, plusieurs demandes peuvent calculer à plusieurs reprises les mêmes données, gaspillant les ressources du serveur.
L'utilisation d'APCU_ENTRY peut éviter efficacement ces problèmes.
apcu_entry évite la course de données par:
Opération atomique : avant d'appeler la fonction de rappel, APCU vérifie si les données existent déjà dans le cache. Si l'entrée du cache existe déjà, APCU_ENTRY renvoie immédiatement les données dans le cache sans exécuter à nouveau la fonction de rappel. La fonction de rappel n'est exécutée que si l'élément de cache n'existe pas.
Mécanisme de verrouillage : APCU_ENTRY verrouillera l'entrée du cache avant d'écrire dans le cache, garantissant qu'une seule demande peut rédiger avec succès des données. D'autres demandes attendent que le verrouillage soit publié et lisez directement les données mises en cache.
Grâce à ce mécanisme, APCU_ENTRY peut éviter efficacement les problèmes de concurrence des données et les calculs répétés.
Supposons que nous devons calculer certaines données complexes et les mettre en cache. Pour éviter de recalculer les données à chaque fois, vous pouvez utiliser APCU_ENTRY pour mettre en cache les résultats du calcul. Voici un exemple simple:
<?php
function calculate_expensive_data() {
// Simuler un processus informatique complexe
sleep(2); // Supposons que cette opération prend du temps
return rand(1, 100);
}
$key = 'expensive_data';
$data = apcu_entry($key, function() {
return calculate_expensive_data();
}, 3600); // Cache de données 1 Heure
echo "The data is: " . $data;
?>
Dans cet exemple, APCU_ENTRY garantit que même si plusieurs demandes accèdent à la touche CHER_DATA en même temps, une seule demande exécutera la fonction calculée_expensive_data , tandis que d'autres demandes renverront directement le résultat mis en cache. Cela réduit considérablement le nombre de calculs répétés et améliore les performances.
Bien qu'APCU_ENTRY puisse éviter efficacement la concurrence des données, les points suivants doivent toujours être prêts à l'attention lors de l'utilisation:
Idétenance des fonctions de rappel : la fonction de rappel doit être idempotent, c'est-à-dire, pour la même entrée, la même sortie est toujours renvoyée. Cela permet de garantir que les données du cache sont cohérentes.
Temps d'expiration du cache : Il est très important de définir raisonnablement le TTL (temps d'expiration) mis en cache. Si le temps d'expiration du cache est réglé trop court, il peut provoquer des défaillances de cache fréquentes et une exécution répétée des fonctions de rappel; S'il est réglé trop longtemps, cela peut entraîner le dépassement des données mis en cache.
Environnement multi-serveur : si l'application est déployée sur plusieurs serveurs, le cache d'APCU n'est valable que pour le serveur actuel. Si vous avez besoin de partager des caches entre plusieurs serveurs, envisagez d'utiliser un système de cache distribué tel que redis ou memcached.
Dans un environnement simultané, une utilisation correcte de la fonction APCU_ENTRY peut considérablement améliorer les performances de l'application et éviter la concurrence de données inutile et les calculs répétés. En tirant parti de son mécanisme de verrouillage intégré et de ses opérations atomiques, les développeurs peuvent gérer efficacement les caches pour assurer la cohérence des données et l'efficacité de calcul. Cependant, il y a encore des détails auxquels faire attention lors de l'utilisation d'APCU_ENTRY pour garantir l'exactitude et les performances du cache.