Aktueller Standort: Startseite> Neueste Artikel> So verwenden Sie apcu_entry, um Cache mit Multi-Process-Programmen freizugeben

So verwenden Sie apcu_entry, um Cache mit Multi-Process-Programmen freizugeben

gitbox 2025-05-26

In der PHP -Entwicklungspraxis werden häufig APCU -Erweiterungen verwendet, um Daten zwischen Anforderungen zu teilen. Da der gemeinsame Gedächtnismechanismus von PHP jedoch durch sein laufendes Modell (insbesondere den Multi-Process-Modus von FPM oder Apache) begrenzt ist, verstehen Entwickler häufig "Multi-Process-gemeinsame Cache". In diesem Artikel wird untersucht, wie die gemeinsame Nutzung von APCU-Cache in einem typischen Multi-Process-Programm über die Funktion apcu_entry implementiert wird.

1. Verstehen Sie den Wirkungsmechanismus von APCU

APCU (Alternativer PHP -Cache -Benutzer) ist ein Benutzer -Cache -Modul von PHP, das das Daten zwischen dem Datenspeicher basierend auf dem gemeinsamen Speicher implementiert. Es ist für den CLI-Modus und den Web-Modus geeignet, hat jedoch eine Einschränkung: Unter dem Multi-Process-Modell wird der variable Speicherplatz zwischen jedem PHP-Prozess nicht gemeinsam genutzt, und die APCU-Freigabe hängt von der Speicherzuordnung ab .

Dies bedeutet, dass alle Prozesse, solange PHP denselben APCU -Speicherbereich verwendet, in diesem gemeinsam genutzten Speicher auf zwischengespeicherte Daten zugreifen können. Obwohl der variable Umfang isoliert ist, ist der Cache nicht.

2. Einführung in die Funktion apcu_entry

apcu_entry ist eine in PHP 5.5+ eingeführte Funktion, um Cache -Elemente zu erhalten oder zu generieren. Die typische Verwendung ist wie folgt:

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

Sein Arbeitsprinzip ist:

  1. Überprüfen Sie, ob cache_key existiert;

  2. Wenn es existiert, kehren Sie direkt zurück.

  3. Wenn es nicht existiert, führen Sie die Funktion im Verschluss aus, zwischen dem Ergebnis und senden Sie sie zurück.

Diese Strategie "Lazy Computing + Caching" eignet sich sehr für die Anforderungen an die Ressourcenfreigabe in mehreren Prozessen.

3. Anwendungspraxis in mehreren Prozessen

Wenn wir beispielsweise PCPS- PCNTL_FORK nehmen, simulieren wir ein Multi-Process-Szenario, um zu überprüfen, ob der Cache gemeinsam genutzt wird:

 <?php
if (!extension_loaded('apcu')) {
    die("APCu Erweiterung nicht aktiviert\n");
}

apcu_clear_cache();

$pid = pcntl_fork();

if ($pid == -1) {
    die("Es kann keinen Kinderprozess erstellen\n");
} elseif ($pid === 0) {
    // Subprozess
    $data = apcu_entry('shared_key', function () {
        echo "Subprozess:Cache Miss,Daten generieren\n";
        return 'Subprozess写入的数据 ' . time();
    });
    echo "Subprozess读取缓存:$data\n";
} else {
    // Elternprozess
    sleep(1); // 等待Subprozess先执行
    $data = apcu_entry('shared_key', function () {
        echo "Elternprozess:Cache Miss,Daten generieren\n";
        return 'Elternprozess写入的数据 ' . time();
    });
    echo "Elternprozess读取缓存:$data\n";
}

Ausgangsanalyse

Normalerweise sehen Sie:

 Subprozess:Cache Miss,Daten generieren
Subprozess读取缓存:Subprozess写入的数据 1715600000
Elternprozess读取缓存:Subprozess写入的数据 1715600000

Dies zeigt, dass der zwischengespeicherte Inhalt von APCU tatsächlich zwischen Eltern- und Kinderprozessen geteilt wird.

4. Vorsichtsmaßnahmen für den Einsatz

  1. Stellen Sie sicher, dass PHP dieselbe SAPI verwendet (z. B. Ausführen mehrerer untergeordneter Prozesse im CLI -Modus) .

  2. Bestätigen Sie, dass apc.enable_cli = 1 in php.ini aktiviert ist , andernfalls wird APCU im CLI -Modus nicht aktiviert.

  3. APCU eignet sich nicht für die Freigabe von Cache (z. B. mehrere PHP-Instanzen unter Lastausgleich) . Wenn Sie einen Multi-Machine-Cache benötigen, verwenden Sie bitte Redis, Memcached und andere Dienste.

  4. Vermeiden Sie die Abhängigkeit von Cache Persistenz . APCU ist ein Cache auf Prozessebene, und das Neustart von PHP-FPM führt zu Datenverlust.

5. Beispielanwendung: Cache -Remote -Schnittstellendaten

Angenommen, wir erhalten Konfigurationsdaten von der Remote -API:

 $config = apcu_entry('remote_config', function () {
    echo "Holen Sie sich Daten von der Remote -Schnittstelle ab...\n";
    $json = file_get_contents('https://gitbox.net/api/config');
    return json_decode($json, true);
});

Solange der Cache nicht abgelaufen ist, ruft kein Prozess diese Logik auf und fordert die Schnittstelle wiederholt an. Dies verbessert die Leistung erheblich und verringert die Anzahl der Remote -Anrufe.

6. Zusammenfassung

APCU_ENTRY bietet einen eleganten Caching -Mechanismus, insbesondere für Szenarien, in denen "hohe Rechenkosten oder hohe Anrufkosten" geeignet sind. In einem Multi-Process-PHP-Programm kann der zwischengespeicherte Inhalt von APCU zwischen den Prozessen geteilt werden, solange es sich um die laufende Umgebung handelt. Das Verständnis der Betriebsprinzipien und -beschränkungen hilft Ihnen dabei, Hochleistungs-PHP-Anwendungen effizienter aufzubauen.