Position actuelle: Accueil> Derniers articles> APCU_ENTRY CACHE et Storage persistant

APCU_ENTRY CACHE et Storage persistant

gitbox 2025-05-21

Dans des applications Web très concurrentes, la lecture et l'écriture fréquentes des données deviendront des goulots d'étranglement des performances. Afin de soulager la pression sur la base de données et d'accélérer l'accès aux données, les développeurs utilisent souvent des mécanismes de mise en cache comme couche intermédiaire. L'APCU est une solution de mise en cache de mémoire légère qui est particulièrement populaire en PHP. Parmi les nombreuses interfaces fournies par APCU , la fonction APCU_ENTRY est devenue un outil puissant pour construire des stratégies de mise en cache de données efficaces avec son atomicité et sa commodité.

Cet article présentera comment utiliser la fonction APCU_ENTRY et combiner le stockage persistant (comme une base de données ou un système de fichiers) pour obtenir des solutions d'accès aux données efficaces et fiables.

1. Qu'est-ce que APCU_ENTRY ?

APCU_ENTRY est une fonction pratique introduite dans PHP 5.5+, qui vous permet de définir une fonction de rappel pour "rembourrer" le cache tout en obtenant la valeur du cache. S'il n'y a pas de clé correspondante dans le cache, il appellera automatiquement la fonction de rappel pour générer des données et écrire dans le cache.

La signature de la fonction est la suivante:

 mixed apcu_entry(string $key, callable $generator, int $ttl = 0)
  • $ key : le nom de clé mis en cache.

  • $ générateur : une fonction de rappel utilisée pour générer des données.

  • $ TTL : Temps de survie du cache (secondes), la valeur par défaut n'est jamais expirée.

2. Modèle collaboratif de mise en cache et de persistance

La méthode traditionnelle d'utilisation du cache est "Vérifiez d'abord le cache, puis la base de données", le processus est le suivant:

  1. Interrogez si le cache frappe.

  2. En cas de coup, retournez directement.

  3. S'il est manqué, lisez les données de la base de données.

  4. Écrivez des données pour cache et retour.

À l'aide d'APCU_ENTRY , nous pouvons compresser la logique ci-dessus en une seule ligne:

 $data = apcu_entry('user_42', function() {
    return fetch_user_from_db(42);
}, 300);

La signification du code ci-dessus est: Essayez de lire User_42 à partir du cache. Sinon, exécutez fetch_user_from_db (42) pour obtenir les données et les mettre en cache pendant 300 secondes.

3. Exemple pratique: combiné avec la base de données

Supposons que nous ayons un tableau d'informations utilisateur et que nous souhaitions maintenant mettre en cache les données utilisateur:

 function fetch_user_from_db($id) {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->execute([$id]);
    return $stmt->fetch(PDO::FETCH_ASSOC);
}

function get_user($id) {
    return apcu_entry("user_$id", function() use ($id) {
        return fetch_user_from_db($id);
    }, 600); // cache 10 minute
}

Ce mode a non seulement du code concis, mais évite également efficacement les problèmes de répartition du cache.

4. Exemples de cache combinés avec une API distante

Certaines données proviennent des API externes et les coûts d'appel sont élevés. Par exemple, obtenez des informations utilisateur à partir de https://api.gitbox.net/user/42 . Nous pouvons également utiliser APCU_ENTRY comme cache:

 function fetch_user_from_api($id) {
    $url = "https://api.gitbox.net/user/$id";
    $response = file_get_contents($url);
    return json_decode($response, true);
}

function get_user_from_api($id) {
    return apcu_entry("api_user_$id", function() use ($id) {
        return fetch_user_from_api($id);
    }, 300); // cache 5 minute
}

Cela peut réduire considérablement la fréquence d'appel des API distantes et d'améliorer la vitesse de réponse.

5. Choses à noter

  1. Limite de mémoire partagée : les données mises en cache d'APCU sont stockées dans la mémoire locale et sont partagées entre différents processus PHP-FPM, alors assurez-vous que APC.SHM_SIZE est suffisant.

  2. Applicable au natif uniquement : APCU est un cache en cours et non pour les environnements multi-serveur. Peut être utilisé conjointement avec des caches distribuées telles que redis, memcached, etc.

  3. Convient aux données avec plus de lecture et moins de lecture : le cache APCU n'est pas recommandé pour les données fréquemment mises à jour, et le mécanisme de synchronisation doit être utilisé pour prévenir les incohérences des données.

6. Résumé

Avec APCU_ENTRY , nous pouvons combiner gracieusement les caches avec un stockage persistant tels que des bases de données ou des API pour écrire du code concis, efficace et tolérant aux pannes. Son atomicité et ses caractéristiques de chargement paresseuses simplifient non seulement le processus de développement, mais améliorent également la maintenabilité du système.

Qu'il soit mis en cache localement dans les résultats de la requête de la base de données ou de réduire la fréquence d'accès aux API distantes, APCU_ENTRY est une solution pratique recommandée. C'est une partie indispensable des projets PHP qui poursuivent l'optimisation des performances.