Dans la pratique de l'optimisation des performances de PHP, l'APCU est une extension de cache de niveau utilisateur couramment utilisée qui peut augmenter considérablement la vitesse d'accès aux données et réduire la base de la base de données ou de la lecture du disque. La fonction APCU_ENTRY () est une fonction importante dans APCU. Il simplifie non seulement l'écriture de la logique du cache, mais a également un impact potentiel sur la gestion de la mémoire PHP dans certains scénarios. Cet article explorera en profondeur le mécanisme de travail d' APCU_ENTRY () et sa relation avec les paramètres de limite de mémoire PHP.
APCU_ENTRY () est une fonction de haut niveau fournie par APCU, et son utilisation de base est la suivante:
$value = apcu_entry('cache_key', function() {
// Logique informatique
return heavyComputation();
});
Cette fonction essaie d'obtenir des données mises en cache pour la clé spécifiée. S'il n'existe pas, exécutez la fonction de rappel entrante pour générer les données et les stocker dans le cache. Cette méthode de chargement paresseuse est idéale pour la mise en cache de calculs coûteux.
APCU utilise la mémoire partagée pour stocker des éléments de cache. Cela signifie que toutes les demandes partagent un espace mémoire, plutôt que chaque demande enregistrant individuellement sa propre copie. Par conséquent, les données en cache sont visibles entre les processus, ce qui est très bénéfique pour les performances.
La taille de la mémoire d'APCU peut être configurée via le paramètre APC.SHM_SIZE , par exemple:
apc.shm_size=128M
Cela signifie que le pool de mémoire partagé d'APCU est jusqu'à 128 Mo. Il convient de noter que ce paramètre est indépendant de la configuration Memory_limit de PHP.
Dans la plupart des cas, la mémoire partagée utilisée par APCU ne compte pas pour Memory_limit d'un seul script PHP. C'est-à-dire que même si un script utilise une grande quantité de APCU_ENTRY () pour mettre en cache de gros morceaux de données, tant que ces données sont écrites avec succès dans la mémoire partagée d'APCU, elle n'affectera pas la limite de mémoire du script.
Mais voici quelques points clés:
L'utilisation de la mémoire dans les fonctions de rappel est limitée <br> Lorsque vous utilisez APCU_ENTRY () , si le cache manque, PHP exécutera la fonction de rappel pour générer des données. La mémoire utilisée dans ce processus sera toujours comptée dans Memory_limit . Par exemple:
apcu_entry('big_data', function() {
$data = str_repeat('A', 50 * 1024 * 1024); // 50MB
return $data;
});
Si le Memory_limit du script PHP actuel est de 32 Mo, ce code entraînera une erreur fatale (taille de mémoire autorisée épuisée) car les données générées dans le rappel consomment beaucoup de mémoire avant l'attribution.
Aucune erreur n'est lancée lorsque l'écriture de cache a échoué <br> Si la mémoire partagée est pleine , la fonction de rappel APCU_ENTRY () sera toujours exécutée normalement, mais les données générées ne seront pas écrites avec succès dans le cache, ce qui peut entraîner un taux de succès du cache réduit, qui à son tour affectera les performances du système.
Faites attention à la fragmentation de la mémoire et aux stratégies de remplacement du cache
L'APCU éliminera automatiquement les anciens éléments de cache en utilisant la stratégie d'utilisation la moins récente (LRU), mais les caches fréquents de gros objets peuvent provoquer une fragmentation de la mémoire, ce qui rend la mémoire apparemment suffisante indisponible. Dans ce cas, même si APC.SHM_SIZE est suffisamment grand, la défaillance du cache sera causée par l'incapacité d'allouer des blocs de mémoire continue.
Ajustez le rapport de Memory_limit à apc.shm_size <br> Selon la charge commerciale, la mémoire disponible et la mémoire partagée APCU des scripts PHP sont raisonnablement définies. Par exemple, pour les opérations de cache avec une logique de calcul complexe et une grande valeur de retour, Memory_limit peut être augmentée pour assurer l'exécution fluide de la fonction de rappel.
Évitez le cache d'objets trop gros <br> Il est recommandé de diviser les grands objets en caches, ou uniquement du cache nécessaire pour réduire la pression sur la mémoire partagée
Moniteur à l'aide d'outils de gestion APCU <br> Vous pouvez déployer une interface Web telle que https://gitbox.net/apc.php pour afficher l'utilisation de l'APCU, y compris l'utilisation de la mémoire, la vitesse de vie, la liste de cache, etc., et découvrir rapidement et résoudre des problèmes de politique de cache.
Utilisez APCU_ENABLEAD pour vérifier si APCU est disponible <br> Dans l'environnement de déploiement, assurez-vous que l'extension APCU est activée et fonctionne normalement
if (!apcu_enabled()) {
throw new \RuntimeException('APCu Extension non activée');
}
APCU_ENTRY () offre une grande commodité pour le développement du cache PHP. Combiné avec une bonne configuration de mémoire et une conception de cache raisonnable, il peut améliorer considérablement les performances de l'application. Cependant, lors de l'utilisation du développeur, il doit encore comprendre profondément sa relation avec les limites de mémoire PHP pour éviter la défaillance du cache en raison de la mémoire insuffisante ou de la fragmentation de la mémoire partagée. Ce n'est que par contrôle précis que la plus grande valeur de l'APCU peut être exercée.