Position actuelle: Accueil> Derniers articles> Comment utiliser APCU_ENTRY pour partager le cache avec des programmes multi-processus

Comment utiliser APCU_ENTRY pour partager le cache avec des programmes multi-processus

gitbox 2025-05-26

Dans la pratique de développement de PHP, les extensions de l'APCU sont souvent utilisées pour partager les données entre les demandes. Cependant, parce que le mécanisme de mémoire partagé de PHP est limité par son modèle en cours d'exécution (en particulier le mode multi-processus de FPM ou Apache), les développeurs comprennent souvent le "cache partagé multi-processus". Cet article explorera comment implémenter l'utilisation partagée du cache APCU dans un programme multi-processus typique via la fonction APCU_ENTRY .

1. Comprendre le mécanisme d'action de l'APCU

APCU (Alternative PHP Cache User) est un module de cache utilisateur de PHP, qui implémente la mise en cache de données basée sur la mémoire partagée. Il convient au mode CLI et au mode Web, mais a une limitation: sous le modèle multi-processus, l'espace variable n'est pas partagé entre chaque processus PHP et le partage APCU dépend de la cartographie de la mémoire .

Cela signifie que tant que PHP utilise la même zone de mémoire APCU, tous les processus peuvent accéder aux données mises en cache dans cette mémoire partagée. Bien que la portée variable soit isolée, le cache ne l'est pas.

2. Introduction à la fonction apcu_entry

APCU_ENTRY est une fonction introduite dans PHP 5.5+ pour obtenir ou générer des éléments de cache. Son utilisation typique est la suivante:

 $value = apcu_entry('cache_key', function() {
    return some_expensive_function();
});

Son principe de travail est:

  1. Vérifiez si Cache_key existe;

  2. S'il existe, revenez directement;

  3. S'il n'existe pas, exécutez la fonction dans la fermeture, cachez le résultat et renvoyez-le.

Cette stratégie «compromis paresseuse + mise en cache» est très adaptée aux exigences de partage des ressources dans plusieurs processus.

3. Pratique de l'application dans plusieurs processus

Prenant un exemple de PHP PCNTL_FORK , nous simulons un scénario multi-processus pour vérifier si le cache est partagé:

 <?php
if (!extension_loaded('apcu')) {
    die("APCu Extension non activée\n");
}

apcu_clear_cache();

$pid = pcntl_fork();

if ($pid == -1) {
    die("Impossible de créer un processus d&#39;enfant\n");
} elseif ($pid === 0) {
    // Sous-processus
    $data = apcu_entry('shared_key', function () {
        echo "Sous-processus:Cache miss,Générer des données\n";
        return 'Sous-processus写入的数据 ' . time();
    });
    echo "Sous-processus读取缓存:$data\n";
} else {
    // Processus parental
    sleep(1); // 等待Sous-processus先执行
    $data = apcu_entry('shared_key', function () {
        echo "Processus parental:Cache miss,Générer des données\n";
        return 'Processus parental写入的数据 ' . time();
    });
    echo "Processus parental读取缓存:$data\n";
}

Analyse de sortie

Habituellement, vous verrez:

 Sous-processus:Cache miss,Générer des données
Sous-processus读取缓存:Sous-processus写入的数据 1715600000
Processus parental读取缓存:Sous-processus写入的数据 1715600000

Cela montre que le contenu mis en cache d'APCU est en effet partagé entre les processus parent et enfant.

4. Précautions de déploiement

  1. Assurez-vous que PHP utilise le même SAPI (par exemple, exécuter plusieurs processus enfants en mode CLI) ;

  2. Confirmez que apc.enable_cli = 1 est activé dans php.ini , sinon APCU ne sera pas activé en mode CLI;

  3. APCU ne convient pas au partage de cache multi-serveur (tel que plusieurs instances PHP sous équilibrage de charge) . Si vous avez besoin d'un cache multi-machine, veuillez utiliser Redis, Memcached et d'autres services;

  4. Évitez la dépendance excessive sur la persistance du cache , APCU est un cache au niveau du processus et le redémarrage de PHP-FPM entraînera une perte de données.

5. Exemple d'application: Cache Données d'interface à distance

Supposons que nous obtenons des données de configuration de l'API distante:

 $config = apcu_entry('remote_config', function () {
    echo "Obtenez des données à partir de l&#39;interface distante...\n";
    $json = file_get_contents('https://gitbox.net/api/config');
    return json_decode($json, true);
});

Tant que le cache n'a pas expiré, aucun processus n'appelle cette logique et demandera à plusieurs reprises l'interface. Cela améliore considérablement les performances et réduit le nombre d'appels distants.

6. Résumé

APCU_ENTRY fournit un mécanisme de mise en cache élégant, particulièrement adapté aux scénarios où "un coût de calcul élevé ou un coût d'appel élevé". Dans un programme PHP multi-processus, le contenu mis en cache de l'APCU peut être partagé entre les processus tant que l'environnement de fonctionnement le permet. Comprendre ses principes de fonctionnement et ses limitations vous aidera à créer plus efficacement les applications PHP haute performance.