Dans les applications PHP, APCU_ENTRY () est une fonction très pratique qui peut simplifier la logique d'écriture en cache. Mais comprenez-vous vraiment comment fonctionne son paramètre de temps d'expiration ( TTL )? L'utilisation inappropriée ne parvient pas seulement à réaliser l'effet de cache idéal, mais peut même provoquer des goulots d'étranglement de performance. Cet article effectuera une analyse approfondie des techniques de réglage du temps d'expiration du cache dans APCU_ENTRY () pour vous aider à vraiment l'utiliser!
APCU_ENTRY () est une fonction fournie par l'extension PHP APCU pour implémenter la logique de "Générer et enregistrer s'il n'y a pas dans le cache" de la manière la plus simple. L'utilisation de base est la suivante:
$value = apcu_entry('my_cache_key', function() {
return 'This is my cached value';
}, 300); // cache 300 Deuxième
Dans le code ci-dessus, si «my_cache_key» n'existe pas dans le cache, la fonction de rappel est exécutée et le résultat est mis en cache pendant 300 secondes.
De nombreux développeurs pensent que le paramètre TTL (Time To Live) dans APCU_ENTRY () est une valeur de sécurité par défaut, mais avez-vous pensé aux questions suivantes?
Que se passe-t-il si TTL est défini sur 0?
Si TTL n'est pas défini, quelle est la valeur par défaut?
TTL est-il un nombre exact de secondes? Y a-t-il une erreur?
Répondons un par un.
Lorsque vous définissez TTL sur 0, cela signifie en fait "jamais expiré". Cela peut sembler bon, en particulier pour les données qui ne changent pas fréquemment, mais il y a des risques: jamais l'expiration signifie que la mémoire d'APCU ne publiera pas activement ces données , ce qui peut éventuellement conduire à un espace de cache insuffisant et exprimer d'autres caches importants.
Par conséquent, à moins que vous ne soyez très clair sur le cycle de vie de certaines données, il n'est pas recommandé de définir un TTL à 0 à volonté.
Si vous ne transmettez pas les paramètres TTL ou passez NULL , la valeur APC.TTL définie par le système sera utilisée par défaut. Vous pouvez afficher cette valeur dans php.ini ou via ini_get ('apc.ttl') . Mais s'appuyer sur les valeurs globales TTL est incertaine, surtout lorsque vous déployez dans plusieurs environnements, les fichiers de configuration peuvent être différents et la stratégie de cache échouera.
La meilleure pratique consiste à toujours spécifier TTL explicitement , ce qui est plus contrôlable.
Pour utiliser correctement TTL, nous devons considérer les stratégies suivantes:
Par exemple:
Le contenu des nouvelles à chaud est mis en cache pendant 300 secondes pour éviter les mises à jour fréquentes;
Informations sur la connexion de l'utilisateur mises en cache pendant 3600 secondes (1 heure);
Éléments de configuration et paramètres système Cache pendant 86400 secondes (1 jour) ou plus.
$config = apcu_entry('site_config', function() {
// Simuler le chargement de la base de données
return [
'site_name' => 'GitBox',
'api_url' => 'https://gitbox.net/api/v1'
];
}, 86400);
Si le temps d'expiration de certaines données n'est pas fixe, vous pouvez calculer dynamiquement le TTL en fonction de la logique métier:
$ttl = time() % 2 == 0 ? 600 : 300; // Pseudo-exemple
$data = apcu_entry('dynamic_key', function() {
return fetchDataFromService();
}, $ttl);
Bien sûr, dans les scénarios commerciaux réels, les ajustements dynamiques peuvent être basés sur des facteurs tels que le niveau de l'utilisateur et le taux de succès du cache.
Si vous utilisez l'URL comme clé, vous pouvez éviter les problèmes de longueur de clé grâce au hachage et définissez TTL:
$url = 'https://gitbox.net/articles/12345';
$key = 'page_' . md5($url);
$pageContent = apcu_entry($key, function() use ($url) {
return file_get_contents($url);
}, 1800); // cache半小时
Cette approche est très adaptée au cache de page statique ou au cache d'agrégation de données d'interface.
Bien qu'APCU_ENTRY () ait encapsulé la logique de "vérifier + écrire", dans certains scénarios spéciaux, vous voudrez peut-être contrôler le processus de manière plus flexible:
$key = 'product_list';
if (!apcu_exists($key)) {
$products = fetchProducts();
apcu_store($key, $products, 600);
} else {
$products = apcu_fetch($key);
}
De cette façon, vous pouvez effectuer une logique supplémentaire en fonction de la question de savoir si le cache frappe ou non, comme les journaux de journalisation, le déclenchement des avertissements précoces, etc.
APCU_ENTRY () est un outil puissant et pratique, mais son paramètre TTL entraînera des déchets de mémoire ou des problèmes de performance s'ils sont mal utilisés. La bonne façon de le faire est:
Définir TTL explicitement pour éviter la dépendance des valeurs par défaut;
N'utilisez pas 0 facilement sauf si vous pouvez contrôler la quantité de données;
Définir un cycle de vie raisonnable en fonction des caractéristiques des données;
Implémentez Dynamic TTL en combinaison avec des scénarios commerciaux;
Ajoutez une logique de jugement existentiel robuste aux caches clés.
Commençons à partir d'aujourd'hui pour vraiment «utiliser le bon TTL d' APCU_ENTRY () pour créer un système de cache plus robuste et contribuer à la vitesse des applications PHP!