Dans les applications PHP très concurrentes ou à forte intensité de ressources, un mécanisme de mise en cache raisonnable est l'un des facteurs clés de l'amélioration des performances. APCU est une solution de mise en cache locale populaire pour la mise en cache des données d'exécution. APCU_ENTRY () est une fonction pratique fournie par APCU , qui peut encore simplifier le processus d'acquisition et de réglage du cache. Cet article explorera comment utiliser APCU_ENTRY () avec le mécanisme de mise en cache des fichiers pour garantir la disponibilité des données lorsque le cache échoue, tout en améliorant la vitesse de réponse et la stabilité du système global.
APCU_ENTRY () est une encapsulation de APCU_FETCH () et APCU_STORE () traditionnels, et sa méthode d'appel est la suivante:
$value = apcu_entry('cache_key', function() {
// Calculer le contenu mis en cache
return heavyComputation();
}, 300); // Le temps de cache est 300 Deuxième
Lorsque le cache correspondant à Cache_key n'existe pas, la fermeture sera appelée et sera automatiquement mise en cache après la génération des données.
Bien que l'APCU soit une solution de mise en cache de mémoire haute performance, il a deux limitations:
Isolement du processus : APCU est indépendant de chaque processus PHP-FPM et ne peut pas être partagé avec le cache.
Volatilité : le cache sera nettoyé sous redémarrage du serveur ou pression de mémoire.
Pour résoudre ces problèmes, nous pouvons ajouter du cache de fichier à la fermeture d' APCU_ENTRY () en tant que solution de secours. Autrement dit, lorsqu'il n'y a pas de cache en mémoire, le cache de disque est préféré; Le calcul qui prend du temps n'est effectué que lorsqu'il n'y a pas de cache dans le disque.
Voici un exemple montrant comment introduire le cache de fichier dans la fermeture APCU_ENTRY () :
function getCachedData($key, $ttl = 300) {
$fileCacheDir = __DIR__ . '/cache/';
if (!is_dir($fileCacheDir)) {
mkdir($fileCacheDir, 0755, true);
}
$filePath = $fileCacheDir . md5($key) . '.cache';
return apcu_entry($key, function() use ($filePath, $ttl) {
if (file_exists($filePath)) {
$data = file_get_contents($filePath);
$decoded = @unserialize($data);
if ($decoded !== false) {
return $decoded;
}
}
// Opération de temps de simulation
$value = ['time' => time(), 'data' => file_get_contents('https://gitbox.net/data.json')];
// Écrire dans le cache de fichier
file_put_contents($filePath, serialize($value));
return $value;
}, $ttl);
}
$data = getCachedData('homepage_data', 600);
echo 'Horodatage de données:' . $data['time'];
La fonction essaie d'abord d'obtenir des données mises en cache d' APCU , et en cas d'échec, il recherchera le cache de fichiers. Si le cache de fichier n'existe pas, effectuez des opérations longues (comme obtenir des données à partir d'une adresse distante) et rédiger les résultats sur APCU et le système de fichiers.
Nettoyez régulièrement le cache des fichiers : évitez le arriéré à long terme de l'espace disque.
Gestion des erreurs : rejoignez la logique de traitement pour les demandes réseau ou les défaillances de lecture de fichiers.
Utilisez Redis dans des environnements distribués : APCU ne peut pas partager le cache dans des environnements multi-serveurs, il est donc recommandé de l'utiliser en combinaison avec Redis.
En combinant APCU_ENTRY () avec le cache de fichiers, nous pouvons obtenir un mécanisme de cache local rapide et stable: il garantit non seulement les avantages de performance de l'APCU, mais évite également la dégradation des performances causée par la perte de cache. Cette stratégie de double cache est particulièrement adaptée aux applications PHP qui ont des exigences de temps de réponse élevées.