Dans les applications PHP simultanées élevées, l'utilisation rationnelle du cache est un moyen clé pour améliorer les performances. APCU est un cache au niveau de la mémoire qui convient au cache de données intermédiaire dans un environnement autonome. C'est une réponse rapide et facile à utiliser. Cependant, le cycle de vie du cache est également limité, et une fois que les données expirent ou sont effacées, cela peut conduire à des avalanches de cache ou à des goulots d'étranglement de concurrence instantanés s'ils sont traités de manière incorrecte.
Cet article présentera comment utiliser la fonction APCU_ENTRY () et explorera comment l'utiliser pour résoudre élégamment les problèmes de performances qui peuvent survenir lorsque le cache expire.
APCU_ENTRY () est une fonction introduite dans PHP 5.5+, et sa fonction est:
Essayez d'obtenir une valeur clé à partir du cache;
S'il n'existe pas, le cache est calculé et écrit à l'aide de la fonction de rappel fournie;
Renvoie la valeur en cache.
La syntaxe de base est la suivante:
mixed apcu_entry(string $key, callable $callback, int $ttl = 0)
$ clé : clé de cache;
$ callback : une fonction exécutée lorsque le cache n'existe pas, utilisé pour générer des valeurs;
$ ttl : le temps valide du cache (secondes), par défaut 0 signifie définitivement valide (jusqu'à ce que la mémoire soit effacée ou que le script se termine).
La soi-disant «panne du cache» fait référence au fait qu'un hotspot cache des données expire, et de nombreuses demandes simultanées contournent le cache et demandent directement des ressources arrière, entraînant une augmentation soudaine de la pression du serveur.
La méthode traditionnelle peut être la suivante:
$key = 'user_profile_123';
$data = apcu_fetch($key);
if ($data === false) {
$data = get_user_profile_from_db(123); // Requête de la base de données
apcu_store($key, $data, 300); // cache 5 minute
}
Le problème est que si le cache échoue, un grand nombre de demandes exécuteront GET_USER_PROFILE_FROM_DB () en même temps, ce qui peut détruire la base de données.
Et apcu_entry () peut être géré comme ceci:
$userId = 123;
$key = "user_profile_$userId";
$data = apcu_entry($key, function() use ($userId) {
// Une seule demande sera exécutée ici,其他请求会等待结果cache后直接获取
return get_user_profile_from_db($userId);
}, 300); // cache 5 minute
Les avantages de cela sont:
Fonctionnement atomique pour éviter plusieurs demandes déclenchant des requêtes lentes en même temps;
Logique simple à utiliser et plus claire;
Mécanisme "de panne" intégré, aucun verrouillage supplémentaire n'est requis.
Supposons que nous ayons une interface qui est fréquemment appelée, par exemple:
https://api.gitbox.net/weather?city=shanghai
Pour réduire la fréquence de l'appel, nous voulons mettre en cache le résultat pendant 60 secondes. Utilisez apcu_entry () pour écrire:
$city = 'shanghai';
$key = "weather_api_result_$city";
$result = apcu_entry($key, function() use ($city) {
$url = "https://api.gitbox.net/weather?city=$city";
$json = file_get_contents($url);
return json_decode($json, true);
}, 60);
De cette façon, lorsque le cache échoue, une seule demande accèdera réellement à l'interface, et d'autres demandes attendront que le cache terminera et partagera le résultat, réduisant considérablement la pression sur les demandes externes.
Scénarios applicables : APCU convient aux environnements autonomes, à l'exception du mode CLI, et ne convient pas aux systèmes multi-processus ou distribués;
Pénétration du cache : apcu_entry () ne résout pas la pénétration du cache (c'est-à-dire les demandes répétées de données qui n'existent pas dans le cache). Vous pouvez déterminer si le résultat est nul dans le rappel, puis décider s'il faut l'écrire;
Contrôle de défaillance : définissez TTL raisonnablement pour éviter une défaillance fréquente du cache et une utilisation excessive de la mémoire;
Gestion des exceptions : il est recommandé de faire une prise d'exception en interne pour éviter les interruptions d'exception dans le processus de cache.
L'utilisation d'APCU_ENTRY () est une stratégie de mise en cache élégante que les développeurs de PHP devraient maîtriser, en particulier lors du traitement des données sur hotspot et un accès simultané élevé, ce qui peut prévenir efficacement les problèmes de gigue de performance causés par la défaillance du cache. Il rend la logique de cache plus simple, plus fiable et plus adaptée aux besoins d'optimisation des performances des applications PHP modernes.
Dans le processus de création d'applications Web haute performance, l'utilisation rationnelle d' APCU_ENTRY () deviendra un outil pour vous améliorer la vitesse de réponse et la stabilité du système.